Android Kotlin 协程 Dispatchers 有哪些值

更新日期: 2023-05-19 阅读次数: 5332 字数: 285 分类: Android

根据具体的场景和需求选择合适的调度器非常重要,这样可以更好地平衡应用的性能和用户体验。

Dispatchers 有哪些值

  • Dispatchers.Main:Android 主线程。用于调用 suspend 函数,UI 框架操作,及更新 LiveData 对象。
  • Dispatchers.IO:非主线程。用于磁盘操作(例如,Room 操作),及网络 I/O 请求(例如,调用服务器 API)。
  • Dispatchers.Default:非主线程,用于 CPU 密集型操作。例如,list 排序,及 JSON 解析。对于长时间运行的计算密集型操作,将其放在 Dispatchers.Main 调度器中会阻塞主线程,导致界面卡顿。因此,推荐将这些操作放在 Dispatchers.Default 调度器中进行处理,以避免对主线程造成影响

这里需要注意的是,在 launch 不加参数时,其默认值是 Dispatchers.Main,而不是 Dispatchers.Default。

Dispatchers.IO 的作用

如果不传递 Dispatchers.IO 参数给 launch,则 coroutine 将运行在主线程 (main thread) 中,而不是 I/O 专用的线程中。即,launch 在不加参数时,其默认值是 Dispatchers.Main。

代码示例

viewModelScope.launch(Dispatchers.IO) {
    // do something,例如 Room 数据库操作
}

最好是指明 Dispatchers 类型,增加代码可读性。

真实的反面案例

我在 Main Activity 中使用

lifecycleScope.launch

执行了一段数据库操作,及 canvas 生成图片操作。且没有指定 Dispatchers,有明显的卡顿现象。

Android Studio 的日志里有提示:

I/Choreographer: Skipped 39 frames! The application may be doing too much work on its main thread.

看来在主线程中执行这些操作确实不合适,我换成 IO 线程就平滑多了。

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式