挂起函数“ callGetApi”只能从协程或其他挂起函数中调用

时间:2018-12-26 07:12:23

标签: android kotlin coroutine kotlinx.coroutines

我正在从onCreate(...)调用暂停的函数

override fun onCreate(savedInstanceState: Bundle?) {
    ...
    ...
    callGetApi()
}

并且暂停的功能是:-

suspend fun callGetApi() {....}

但错误显示仅应从协程或其他暂停函数调用暂停函数'callGetApi'

3 个答案:

答案 0 :(得分:7)

挂起函数只能从协程调用。这意味着您需要使用协程生成器,例如launch。例如:

class Activity : AppCompatActivity(), CoroutineScope {
    private var job: Job = Job()

    override val coroutineContext: CoroutineContext
        get() = Dispatchers.Main + job

    override fun onDestroy() {
        super.onDestroy()
        job.cancel()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        launch {
            val result =  callGetApi()
            onResult(result) // onResult is called on the main thread
        }
    }

    fun onResult(result: ...) {}
}

要在Android中使用Dispatchers.Main,请向应用程序的build.gradle文件添加依赖项:

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.1'

答案 1 :(得分:2)

以上答案有效,但我解决了它,而没有通过仅使用...来继承CoroutineScope类。

  GlobalScope.launch (Dispatchers.Main) { callGetApi() }

Dispatchers.Main很重要,因为您无法在除main之外的任何其他线程中更新UI。

但建议继承CoroutineScope来维持活动的生命周期,并继承活动onDestroy来终止工作

答案 2 :(得分:0)

描述为here的一种方法似乎是截至 2019年7月的最优雅的方法:

import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.launch

class Activity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super...

        lifecycleScope.launch {
            val result =  callGetApi()
            onResult(result) 
        }
    }
}

别忘了添加相应的lib:

implementation lifecycle-runtime-ktx:2.2.0-alpha02