挂起函数 'callGetApi' 只能从协程或另一个挂起函数中调用

Suspend function 'callGetApi' should be called only from a coroutine or another suspend function

我正在从 onCreate(...) 调用挂起函数

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

暂停的功能是:-

suspend fun callGetApi() {....}

但是出现错误 暂停函数 'callGetApi' 只能从协同程序或其他暂停函数中调用

Suspend function should be called only from a coroutine.

这意味着调用 suspend 函数需要使用 coroutine builder,例如launchasyncrunBlocking(建议仅在单元测试中使用)。例如:

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?) {
        super.onCreate(savedInstanceState)
        launch {
            val result =  callGetApi()
            onResult(result) // onResult is called on the main thread
        }
    }

    suspend fun callGetApi(): String {...}

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

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

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

最近的方法 将使用 ViewModelActivity/Fragment 中的扩展属性:

它附加到 Activity/Fragment 的生命周期,并在销毁时取消已启动的协程。

上面的答案有效,但我在没有继承 CoroutineScope class 的情况下解决了它,只使用了.... gradle.build

  dependencies {
      implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.3'
  }

Activity.kt

  import kotlinx.coroutines.GlobalScope
  import kotlinx.coroutines.Dispatchers

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

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

但是建议继承CoroutineScope维护activity的生命周期,activity的onDestroykill job

看起来是截至 2019 年 7 月最优雅的方式,就是描述的方式 here:

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

class Activity : AppCompatActivity() {

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

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

不要忘记添加相应的库:

implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0-alpha02"