Kotlin 协程 viewModelScope 中的改造调用

Tik*_*iko 22 android kotlin retrofit android-viewmodel kotlin-coroutines

最近我更新了我ViewModel的使用新的viewModelScope. 从它的实现来看,我看到它Dispatchers.Main.immediate被设置CoroutineDispatcherviewModelScope.

所以当打印当前ThreadviewModelScope.launch它给Thread[main,5,main]

但这是我的问题。尽管它在主线程中运行,但以下代码对我执行网络调用有效。

viewModelScope.launch {
    userRepo.login(email, password)
}
Run Code Online (Sandbox Code Playgroud)

userRepo.login(email, password)suspend函数,它调用Retrofit suspend函数。

那么这是如何工作的,如果我的当前线程是主线程?

Kis*_*kae 23

它有效是因为 Retrofit 的suspend实现委托给Call<T>.enqueue. 这意味着默认情况下它已经在自己的后台执行程序上执行,而不是使用调用者的Dispatcher.

  • 如果我在 withContext(Dispatchers.IO) 块中调用此挂起函数会怎样?它仍然在 Call&lt;T&gt;.enqueue 中运行吗?如果是,那么使用 Dispatchers.IO 创建的线程就没用了?还有什么方法可以调试或检查 Retrofit 的实现吗?如果改造无论如何都会调用 enqueue 那么它是像 Dispatchers.IO 这样的轻量级线程吗 (2认同)
  • 是的,它仍然运行在 Okhttp 的调度程序上。不,创建的线程并不是无用的,因为应用了正常的协程优化。查看“HttpServiceMethod”类进行调试。并且使用的调度程序取决于提供给Retrofit的`OkHttpClient`的配置。 (2认同)