Kotlin协同程序viewModelScope

时间:2020-04-14 19:46:53

标签: android kotlin retrofit kotlin-coroutines android-viewmodel

最近,我已将ViewModel更新为使用新的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函数。

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

2 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:0)

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

如果需要,可以将此调度程序与viewmodelScope一起使用,然后所有挂起函数都与此调度程序一起运行。

现在,ViewModel是一个执行程序(将执行从Main更改为后台的类)

如果要在ViewModel中更改调度程序,一个好的做法是通过构造函数注入此Dispatcher来测试ViewModel。