挂起函数 '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,例如launch
、async
或 runBlocking
(建议仅在单元测试中使用)。例如:
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
we can use viewModelScope
中启动协程:
viewModelScope.launch { ... }
它附加到 Activity/Fragment
的生命周期,并在销毁时取消已启动的协程。
- 与
Activity/Fragment
类似,我们可以使用以下扩展属性来启动协程:
lifecycleScope.launch {}
, lifecycle.coroutineScope.launch {}
, viewLifecycleOwner.lifecycleScope.launch {}
(适用于Fragments
)。
上面的答案有效,但我在没有继承 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的onDestroy
kill 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"
我正在从 onCreate(...) 调用挂起函数
override fun onCreate(savedInstanceState: Bundle?) {
...
...
callGetApi()
}
暂停的功能是:-
suspend fun callGetApi() {....}
但是出现错误 暂停函数 'callGetApi' 只能从协同程序或其他暂停函数中调用
Suspend function should be called only from a coroutine.
这意味着调用 suspend
函数需要使用 coroutine builder,例如launch
、async
或 runBlocking
(建议仅在单元测试中使用)。例如:
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
we can useviewModelScope
中启动协程:viewModelScope.launch { ... }
它附加到 Activity/Fragment
的生命周期,并在销毁时取消已启动的协程。
- 与
Activity/Fragment
类似,我们可以使用以下扩展属性来启动协程:lifecycleScope.launch {}
,lifecycle.coroutineScope.launch {}
,viewLifecycleOwner.lifecycleScope.launch {}
(适用于Fragments
)。
上面的答案有效,但我在没有继承 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的onDestroy
kill 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"