withContext(Dispatchers.IO) 与 viewModelScope.launch(Dispatchers.IO) 的区别

发布时间: 2021-02-07 10:56:30 作者: 大象笔记

CoroutineScope withContext lifecycleScope viewModelScope 该如何选择

CoroutineScope, withContext, lifecycleScope, 和 viewModelScope 是 Android 中用于协程管理的不同组件和类。这些组件和类可以帮助您在 Android 应用程序中正确地使用协程。

选择何种范围取决于您的需求。例如:

viewModelScope 的作用

viewModelScope.launch(Dispatchers.IO) {
    // do something
}

当用户从一个界面退出,其对应的 ViewModel 会被销毁,相应的此 ViewModel 的 viewModelScope 会被自动取消 (cancelled),所有运行在 viewModelScope 中的 coroutine 也会被取消。

所以,没人会用 CoroutineScope.launch,原因就是当 UI 界面退出,但是 coroutine 运行时间过长,这个 coroutine 将得不到清理。

withContext(Dispatchers.IO) 与 viewModelScope.launch(Dispatchers.IO) 的区别

首先 withContext 也是一个 suspend function,所以 withContext 必须在 suspend 函数,或者 coroutine 中被调用。

例如:

suspend fun updatePage() {                      
    val result = getDataFromServer("www.sunzhongwei.com")  
    show(result)                               
}

suspend fun getDataFromServer(url: String) =                 
    withContext(Dispatchers.IO) {              
        // 执行网络请求          
    }                                          

viewModelScope 需要在 ViewModel 中使用

参考

https://medium.com/androiddevelopers/easy-coroutines-in-android-viewmodelscope-25bffb605471

参考

我是一名山东烟台的开发者,联系作者