Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Kotlin Coroutines viewModelScope中的改装调用_Android_Kotlin_Retrofit_Kotlin Coroutines_Android Viewmodel - Fatal编程技术网

Android Kotlin Coroutines viewModelScope中的改装调用

Android Kotlin Coroutines viewModelScope中的改装调用,android,kotlin,retrofit,kotlin-coroutines,android-viewmodel,Android,Kotlin,Retrofit,Kotlin Coroutines,Android Viewmodel,最近我更新了我的ViewModel以使用新的viewModelScope。从它的实现中,我看到Dispatchers.Main.immediate被设置为viewModelScope的默认CoroutineDispatcher 因此,在viewModelScope.launch中打印当前线程时,它会给出线程[main,5,main] 但这是我的问题。虽然这在主线程中运行,但下面的代码对我来说是可行的,它执行网络调用 viewModelScope.launch { userRepo.log

最近我更新了我的
ViewModel
以使用新的
viewModelScope
。从它的实现中,我看到
Dispatchers.Main.immediate
被设置为
viewModelScope
的默认
CoroutineDispatcher

因此,在
viewModelScope.launch中打印当前
线程时,它会给出线程[main,5,main]

但这是我的问题。虽然这在主线程中运行,但下面的代码对我来说是可行的,它执行网络调用

viewModelScope.launch {
    userRepo.login(email, password)
}
这里的
userRepo.login(电子邮件、密码)
suspend
函数,它调用
改造
suspend
函数


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

这是因为改型的
suspend
实现委托给
Call.enqueue
。这意味着默认情况下,它已经在自己的后台执行器上执行,而不是使用调用者的
调度程序

挂起函数,从主线程调用这些函数总是安全的。但若你们要做一些繁重的操作,比如从服务器、数据库、内容加载器获取数据。。。最好使用适当的dispatcher,例如dispatcher.IO

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

现在ViewModel是一个执行器(一个将执行从Main更改为background的类)


如果要更改ViewModel中的dispatcher,一个好的做法是通过构造函数注入此dispatcher以测试ViewModel。

如果我在withContext(Dispatchers.IO)块中调用此挂起函数,会怎么样?它是否仍在Call.enqueue中运行?如果是,那么使用Dispatchers.IO创建的线程是无用的?还有什么方法可以调试或检查改造的实施情况吗?若改型仍然调用enqueue,那个么它是作为Dispatchers的轻量级线程。是的,它仍然在Okhttp的dispatcher上运行。不,创建的线程不是无用的,因为正常的协同路由优化适用。查看
HttpServiceMethod
类以进行调试。使用的调度程序取决于为改装提供的
OkHttpClient
的配置。