Kotlin协程之Dispather

这篇博客将会介绍几种 Dispatchers 的用法。

Dispatchers 可以决定协程运行在什么线程上,协程将在特定的线程中运行这些任务。

协程中的Dispatchers 与 RxJava 中的 Schedulers 类似

我们在安卓项目中通常使用以下几种 Dispathers

但是当我们查看文档,还会发现还有一种

  • Dispathers.UnConfined

所以,在 kotlin 协程中有四种类型的 Dispathers

  • Dispatchers.Default
  • Dispatchers.IO
  • Dispathers.Main
  • Dispathers.UnConfined

Dispathers.Default

我们应该使用Dispathers.Default去执行 CPU 密集型任务。

举例如下:

  • 执行计算繁琐的任务,例如矩阵聚酸
  • 对内存中存在的较大列表执行任何操作,例如排序、过滤、查找等
  • 对内存中的 bitmap 进行过滤操作。注意,不是指硬盘中读取图片文件
  • 解析内存中可用的 JSON。注意,不是指从文件中读取 JSON 文件
  • 缩放内存中已经存在的 bitmap。
  • 对内存中的 bitmap 任意操作。

现在我们知道了什么时候该使用Dispathers.Default

我们可以认为 Dispather.Default 与 RxJava 中的 Schedulers.computation()

kotlin 复制代码
launch(Dispathers.Default) {
	// cpu 密集任务
}

Dispathers.IO

我们应该使用Dispathers.IO 去处理硬盘或者网络 IO 任务。

举例如下:

  • 任何网络相关的操作,如网络请求
  • 从服务端下载文件
  • 将文件从一个地方移动到另一个地方
  • 读取文件
  • 写入文件
  • 数据库查询
  • 加载 sp

简而言之,任何文件系统操作或者网络相关操作都应该使用Dispathers.IO,因为这是IO 相关的任务。

我们可以认为 Dispathers.IO与Rxjava 中的 Schedulers.io()类似

Dispathers.Main

我们应该使用Dispatchers.Main去执行一个在安卓主线程运行的协程。我们都知道应该在什么情况下使用主线程。通常都是在执行 UI 操作或者一些简单的任务。

举例如下:

  • 处理 UI 相关任务
  • 简单任务,如内存中较小长度列表的排序。

我们可以认为Dispatcher.Main与 RxAndroid 中的AndroidSchedulers.mainThread()类型

kotlin 复制代码
launch(Dispathers.Main) {
    // 主线程相关任务
}

Dispathers.Unconfined

As per the official documentation: A coroutine dispatcher that is not confined to any specific thread. It executes the initial continuation of a coroutine in the current call frame and lets the coroutine resume in whatever thread that is used by the corresponding suspending function, without mandating any specific threading policy.

它将不改变线程。当其启动的时候,它运行在启动它的线程之上,当其被恢复的时候,它运行在恢复它的线程智商。

简而言之: 当我们不关心协程运行在什么线程之上的时候,就可以使用Dispathers.Unconfined

kotlin 复制代码
launch(Dispathers.Unconfined) {
    // 不关心运行在何种线程之上的任务
}
相关推荐
fish_xk2 小时前
c++中的引用和数组
开发语言·c++
酒尘&4 小时前
JS数组不止Array!索引集合类全面解析
开发语言·前端·javascript·学习·js
冬夜戏雪5 小时前
【java学习日记】【2025.12.7】【7/60】
java·开发语言·学习
xwill*5 小时前
分词器(Tokenizer)-sentencepiece(把训练语料中的字符自动组合成一个最优的子词(subword)集合。)
开发语言·pytorch·python
一过菜只因5 小时前
MySql Jdbc
android·数据库·mysql
咖啡の猫5 小时前
Python列表的查询操作
开发语言·python
quikai19816 小时前
python练习第三组
开发语言·python
音视频牛哥6 小时前
Android音视频开发:基于 Camera2 API 实现RTMP推流、RTSP服务与录像一体化方案
android·音视频·安卓camera2推流·安卓camera2推送rtmp·安卓camera2 rtsp·安卓camera2录制mp4·安卓实现ipc摄像头
2501_937145416 小时前
2025 IPTV 源码优化版:稳定兼容 + 智能升级
android·源码·电视盒子·源代码管理·机顶盒
JIngJaneIL6 小时前
基于Java非遗传承文化管理系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot