[ PROMPT_NODE_24936 ]
kotlin-coroutines-expert
[ SKILL_DOCUMENTATION ]
# Kotlin 协程专家
## 概述
掌握 Kotlin 协程异步编程的指南。涵盖结构化并发、`Flow` 转换、异常处理和测试策略等高级主题。
## 何时使用此技能
- 当你在 Kotlin 中实现异步操作时。
- 当你使用 `Flow` 设计响应式数据流时。
- 当你调试协程取消或异常时。
- 当你为挂起函数或 Flow 编写单元测试时。
## 分步指南
### 1. 结构化并发
始终在定义的 `CoroutineScope` 内启动协程。使用 `coroutineScope` 或 `supervisorScope` 对并发任务进行分组。
kotlin
suspend fun loadDashboardData(): DashboardData = coroutineScope {
val userDeferred = async { userRepo.getUser() }
val settingsDeferred = async { settingsRepo.getSettings() }
DashboardData(
user = userDeferred.await(),
settings = settingsDeferred.await()
)
}
### 2. 异常处理
对于顶层作用域使用 `CoroutineExceptionHandler`,但在挂起函数内部应依赖 `try-catch` 以实现细粒度控制。
kotlin
val handler = CoroutineExceptionHandler { _, exception ->
println("Caught $exception")
}
viewModelScope.launch(handler) {
try {
riskyOperation()
} catch (e: IOException) {
// 特殊处理网络错误
}
}
### 3. 使用 Flow 的响应式流
对于需要保留的状态使用 `StateFlow`,对于事件使用 `SharedFlow`。
kotlin
// 冷流 (惰性)
val searchResults: Flow<List> = searchQuery
.debounce(300)
.flatMapLatest { query -> searchRepo.search(query) }
.flowOn(Dispatchers.IO)
// 热流 (状态)
val uiState: StateFlow = _uiState.asStateFlow()
## 示例
### 示例 1:带错误处理的并行执行
kotlin
suspend fun fetchDataWithErrorHandling() = supervisorScope {
val task1 = async {
try { api.fetchA() } catch (e: Exception) { null }
}
val task2 = async { api.fetchB() }
// 如果 task2 失败,task1 不会被取消,因为使用了 supervisorScope
val result1 = task1.await()
val result2 = task2.await() // 可能会抛出异常
}
## 最佳实践
- ✅ **建议:** 对阻塞 I/O 操作使用 `Dispatchers.IO`。
- ✅ **建议:** 在不再需要作用域时取消它们(例如 `ViewModel.onCleared`)。
- ✅ **建议:** 使用 `TestScope` 和 `runTest` 对协程进行单元测试。
- ❌ **禁止:** 使用 `GlobalScope`。