在Kotlin Coroutines viewModelScope中进行改造调用

问题描述 投票:2回答:2

最近,我已将ViewModel更新为使用新的viewModelScope,默认情况下它具有superviserJob并在jobViewModel回调中取消了onClear()。因此,现在我不需要实现CourotineScope并由我自己做上述工作人员,而只需使用viewModelScope。从其实现中,我看到Dispatchers.Main.immediate被设置为CoroutineDispatcher的默认viewModelScope

因此,当在Thread中打印当前的viewModelScope.launch时,它给出Thread [main,5,main]] >>

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

viewModelScope.launch {
    userRepo.login(email, password)
}

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

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

最近,我更新了ViewModel以使用新的viewModelScope,默认情况下,它具有superviserJob并取消了ViewModel的onClear()回调中的作业。所以现在我不需要实现...

android kotlin retrofit kotlin-coroutines android-viewmodel
2个回答
4
投票

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


0
投票

挂起函数始终可以从主线程中安全调用。但是,如果要进行繁重的操作,例如从服务器,数据库,内容加载器中获取数据,则最好使用适当的调度程序,例如Dispatcher.IO。

© www.soinside.com 2019 - 2024. All rights reserved.