我正在从onCreate(...)调用暂停的函数
override fun onCreate(savedInstanceState: Bundle?) {
...
...
callGetApi()
}
并且暂停的功能是:-
suspend fun callGetApi() {....}
但错误显示仅应从协程或其他暂停函数调用暂停函数'callGetApi'
答案 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