android Kotlin协同程序viewModelScope中的Retrofit调用

nhaq1z21  于 2023-04-10  发布在  Android
关注(0)|答案(2)|浏览(193)

最近我更新了我的ViewModel以使用新的viewModelScope。从它的实现中,我看到Dispatchers.Main.immediate被设置为viewModelScope的默认CoroutineDispatcher
因此,当在viewModelScope.launch中打印当前Thread时,它给出Thread[main,5,main]
但是,即使这在主线程中运行,下面的代码对我来说也是有效的,它执行网络调用。

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

这里userRepo.login(email, password)suspend函数,它调用Retrofitsuspend函数。
那么,如果我的当前线程是主线程,这是如何工作的呢?

cmssoen2

cmssoen21#

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

rkttyhzu

rkttyhzu2#

从主线程调用suspend函数总是安全的。但是如果你要做繁重的操作,比如从服务器、数据库、内容加载器获取数据......最好使用适当的调度器,例如Dispatcher.IO。
如果你愿意的话,你可以将这个调度器与viewmodelScope一起使用,然后所有的挂起函数都将使用这个调度器运行。
现在ViewModel是一个Executor(一个将执行从Main更改为后台的类)
如果您要更改ViewModel中的Dispatcher,一个好的做法是通过构造函数注入这个Dispatcher来测试ViewModel。

相关问题