本文同步发表于微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新

1. 主要调度器

调度器 用途 线程池
Dispatchers.Main UI 操作 主线程(Android/Swing/JavaFX)
Dispatchers.IO 网络、文件操作 共享线程池,可动态扩展
Dispatchers.Default CPU 密集型任务 线程数 = CPU 核心数
Dispatchers.Unconfined 特殊场景 不固定,延续在任意线程

2. 使用示例

suspend fun example() {
    // Main - UI 操作
    withContext(Dispatchers.Main) {
        textView.text = "Loading..."
    }
    
    // IO - 网络/文件操作
    val data = withContext(Dispatchers.IO) {
        api.fetchData() // 网络请求
    }
    
    // Default - CPU 密集型
    val result = withContext(Dispatchers.Default) {
        heavyComputation() // 复杂计算
    }
    
    // 更新 UI
    withContext(Dispatchers.Main) {
        textView.text = result
    }
}

3. 调度器特性对比

// 查看线程池信息
println(Dispatchers.Default)  // Dispatchers.Default
println(Dispatchers.IO)       // Dispatchers.IO
println(Dispatchers.Main)     // Dispatchers.Main
println(Dispatchers.Unconfined) // Dispatchers.Unconfined

// 限制并行度
val limited = Dispatchers.IO.limitedParallelism(5)

4. 自定义调度器

// 创建单线程调度器
val singleThread = newSingleThreadContext("MyThread")

// 创建固定大小线程池
val fixedThread = newFixedThreadPoolContext(4, "MyPool")

// 使用 Executor 转换
val executor = Executors.newCachedThreadPool().asCoroutineDispatcher()

作用域 + 调度器组合

创建自定义作用域

// 组合多个上下文元素
val scope = CoroutineScope(
    Dispatchers.IO + 
    SupervisorJob() + 
    CoroutineName("MyCoroutine")
)

scope.launch {
    // 使用 IO 调度器,SupervisorJob 模式
    println(coroutineContext[CoroutineName]) // MyCoroutine
}

上下文继承与覆盖

val scope = CoroutineScope(Dispatchers.Main)

scope.launch {
    println(Thread.currentThread().name) // main
    
    // 覆盖调度器
    withContext(Dispatchers.IO) {
        println(Thread.currentThread().name) // DefaultDispatcher-worker-1
    }
}

实际应用模式

class DataRepository(
    private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO
) {
    private val scope = CoroutineScope(SupervisorJob() + ioDispatcher)
    
    suspend fun fetchData(): Result {
        return withContext(ioDispatcher) {
            // 数据获取逻辑
        }
    }
    
    fun cancel() {
        scope.cancel()
    }
}

选择与对比

场景 推荐作用域 推荐调度器
Android Activity lifecycleScope Dispatchers.Main
Android ViewModel viewModelScope Dispatchers.Main
后台服务 自定义 CoroutineScope Dispatchers.IO 或 Dispatchers.Default
单元测试 runBlocking Dispatchers.Unconfined 或 TestDispatcher
独立任务 coroutineScope 根据任务类型选择
需要容错 supervisorScope 根据任务类型选择
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐