根据具体的场景和需求选择合适的调度器非常重要,这样可以更好地平衡应用的性能和用户体验。
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 聊聊, 查看更多联系方式