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

更新日期: 2021-02-16 阅读次数: 182 字数: 265 分类: Android

viewModelScope 的作用

viewModelScope.launch(Dispatchers.IO) {
    // do something
}
  • viewModelScope 是一个内置的 CoroutineScope,包含在 ViewModel KTX 扩展中
  • Dispatchers.IO 是为了注明当前 coroutine 需要运行在一个用来执行 I/O 操作的线程中

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

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

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

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

  • viewModelScope.launch(Dispatchers.IO),即 launch 的 coroutine 运行之后,不再返回数据
  • withContext(Dispatchers.IO) 会将 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

参考

领取阿里云/腾讯云服务器优惠券

关于作者

我是来自山东烟台的一名开发者,喜欢瞎折腾,顺便记记笔记。有敢兴趣的话题,欢迎加微信 zhongwei 聊聊, 查看更多联系方式。 白天写程序,晚上哄熊孩子,可能回复有点慢,见谅。同时也欢迎关注我的微信公众号“大象工具”: 大象工具微信公众号

相关文章

爱评论不评论

近期节日

查看更多节日