线程与调度
源:Kotlin Coroutines | Dispatchers
KMP 通过 Kotlin 协程和 Dispatchers 统一了多线程编程,但各平台的线程模型仍有差异。本文展示如何正确使用协程调度器。
平台差异对比
| 平台 | 主线程 | IO 线程 | 默认线程 |
|---|---|---|---|
| Android | Dispatchers.Main (UI 线程) | Dispatchers.IO | Dispatchers.Default |
| iOS | Dispatchers.Main (主队列) | Dispatchers.Default | Dispatchers.Default |
| Desktop | Dispatchers.Main (Swing EDT) | Dispatchers.IO | Dispatchers.Default |
标准代码块
kotlin
import kotlinx.coroutines.*
class DataRepository {
// IO 操作:网络请求、文件读写
suspend fun fetchData(): String = withContext(Dispatchers.IO) {
// 网络请求或文件操作
delay(1000)
"Data from server"
}
// CPU 密集操作:图片处理、加密
suspend fun processData(data: String): String = withContext(Dispatchers.Default) {
// CPU 密集计算
data.uppercase()
}
// UI 更新:必须在主线程
suspend fun updateUI(result: String) = withContext(Dispatchers.Main) {
// 更新 UI
println("UI updated: $result")
}
// 完整流程
suspend fun loadAndDisplay() {
val data = fetchData() // IO 线程
val processed = processData(data) // Default 线程
updateUI(processed) // Main 线程
}
}依赖补充
kotlinx.coroutines
kotlin
kotlin {
sourceSets {
commonMain.dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")
}
androidMain.dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")
}
jvmMain.dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-swing:1.7.3")
}
}
}最新版本:https://github.com/Kotlin/kotlinx.coroutines/releases
实战坑点
iOS Dispatchers.IO 不存在
iOS 无 IO 调度器
iOS 平台无 Dispatchers.IO,应使用 Dispatchers.Default。
解决方案:
kotlin
val ioDispatcher = when (Platform.osFamily) {
OsFamily.IOS -> Dispatchers.Default
else -> Dispatchers.IO
}