挂起函数"callGetApi"应仅从协程或其他挂起函数调用



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

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

暂停的功能是:-

suspend fun callGetApi() {....}

但是错误显示挂起函数"callGetApi"应仅从协程或其他挂起函数调用

应仅从协程调用挂起函数。

这意味着要调用suspend函数,您需要使用协程构建器,例如 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'
<小时 />

最新的方法是ViewModel中使用扩展属性,Activity/Fragment

  • ViewModel我们可以使用viewModelScope来启动协程:

    viewModelScope.launch { ... }
    

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

  • Activity/Fragment类似,我们可以使用以下扩展属性来启动协程: lifecycleScope.launch {}lifecycle.coroutineScope.launch {}viewLifecycleOwner.lifecycleScope.launch {}(适用于Fragments)。

截至 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) 
        }
    }
}

不要忘记添加相应的库:

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

上面的答案有效,但我解决了它,而没有继承CoroutineScope类,只需使用 ....gradle.build

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

活动.kt

  import kotlinx.coroutines.GlobalScope
  import kotlinx.coroutines.Dispatchers
  GlobalScope.launch (Dispatchers.Main) { callGetApi() }

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

但它建议继承 CoroutineScope 来维护活动的生命周期和活动的onDestroy以杀死作业

相关内容

  • 没有找到相关文章

最新更新