最近,我已经更新了ViewModel
以使用新的viewModelScope
。从其实现中,我看到Dispatchers.Main.immediate
被设置为CoroutineDispatcher
的默认viewModelScope
。
因此,当在Thread
中打印当前的viewModelScope.launch
时,它会给出线程[main,5,main]
但是,这是我的问题。尽管这在主线程中运行,但是以下代码对我有用,它执行网络调用。
viewModelScope.launch {
userRepo.login(email, password)
}
这里
userRepo.login(email, password)
是suspend
函数,它调用Retrofit
suspend
函数。那么,如果我的当前线程是主线程,这如何工作?
最佳答案
它之所以有效,是因为Retrofit的suspend
实现将委托(delegate)委托(delegate)给Call<T>.enqueue
。这意味着默认情况下它已经在自己的后台执行器上执行,而不是使用调用者的Dispatcher
。