我在 Android 应用程序中使用 MVVM 架构模式。我想使用
ViewModel
从我的 coroutinescope.lauch{}
进行 API 调用,我是否需要将调度程序指定为 Dispatcher.IO
,因为它将在 IO 线程中执行,或者只使用 ViewModel
提供的调度程序,即 Dispatcher.Main
?
ViewModel
类上有一个扩展属性,称为 viewModelScope
,默认情况下适用于 Dispatcher.Main
上下文。如果您的 api 函数是 suspend
,您可以使用它来调用,例如:
viewModelScope.launch {
apiFunction()
// do other stuff
}
suspend fun apiFunction() { ... }
可以在
suspend
上下文中调用 Dispatchers.Main
函数,它们会挂起协程,但不会阻塞 Main Thread
。
如果您的 API 函数不是
suspend
,您可以通过使用 suspend
函数将上下文切换到 Dispatchers.IO
,将它们转换为 withContext()
函数。或者,如果 API 函数使用回调,您可以考虑使用 suspendCoroutine
或 suspendCancellableCoroutine
。使用 withContext
的示例:
viewModelScope.launch {
apiSuspendFunction()
// do other stuff
}
suspend fun apiSuspendFunction() = withContext(Dispatchers.IO) {
apiNonSuspendFunction()
}
fun apiNonSuspendFunction() { ... }
对于api调用Dispatcher.IO更好
了解更多信息
https://proandroiddev.com/kotlin-coroutines-in-android-summary-1ed3048f11c3
https://miro.medium.com/max/720/1*K-5ZG6rVR5Dl9J5E3Rx7eA.png
在你的情况下,你使用 mvvm 所以更好地使用 ViewModelScope
viewModelScope.launch {
// operation
}