
关于
Kotlin 协程和 Flow 的专家模式,涵盖结构化并发、错误处理和测试。
name: kotlin-coroutines-expert description: "Kotlin 协程和 Flow 的专家模式,涵盖结构化并发、错误处理和测试。" risk: safe source: community date_added: "2026-02-27"
Kotlin 协程专家
概述
掌握 Kotlin 协程异步编程的指南。涵盖结构化并发、Flow 转换、异常处理和测试策略等高级主题。
何时使用此技能
- 在 Kotlin 中实现异步操作时使用
- 使用
Flow设计响应式数据流时使用 - 调试协程取消或异常时使用
- 为挂起函数或 Flow 编写单元测试时使用
分步指南
1. 结构化并发
始终在定义的 CoroutineScope 内启动协程。使用 coroutineScope 或 supervisorScope 来分组并发任务。
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 进行细粒度控制。
val handler = CoroutineExceptionHandler { _, exception ->
println("Caught $exception")
}
viewModelScope.launch(handler) {
try {
riskyOperation()
} catch (e: IOException) {
// 专门处理网络错误
}
}
3. 使用 Flow 的响应式流
对需要保留的状态使用 StateFlow,对事件使用 SharedFlow。
// 冷流(惰性)
val searchResults: Flow<List<Item>> = searchQuery
.debounce(300)
.flatMapLatest { query -> searchRepo.search(query) }
.flowOn(Dispatchers.IO)
// 热流(状态)
val uiState: StateFlow<UiState> = _uiState.asStateFlow()
示例
示例 1:带错误处理的并行执行
suspend fun fetchDataWithErrorHandling() = supervisorScope {
val task1 = async {
try { api.fetchA() } catch (e: Exception) { null }
}
val task2 = async { api.fetchB() }
// 由于使用 supervisorScope,如果 task2 失败,task1 不会被取消
val result1 = task1.await()
val result2 = task2.await() // 可能抛出异常
}
最佳实践
- ✅ 应该: 对阻塞 I/O 操作使用
Dispatchers.IO。 - ✅ 应该: 在不再需要时取消作用域(如
ViewModel.onCleared)。 - ✅ 应该: 使用
TestScope和runTest进行协程单元测试。 - ❌ 不要: 使用
GlobalScope。它破坏结构化并发并可能导致泄漏。 - ❌ 不要: 捕获
CancellationException,除非你重新抛出它。
故障排除
问题: 协程测试挂起或不可预测地失败。
解决方案: 确保使用 runTest 并将 TestDispatcher 注入到类中,以便控制虚拟时间。
限制
- 仅在任务明确匹配上述描述的范围时使用此技能。
- 不要将输出视为环境特定验证、测试或专家审查的替代品。
- 如果缺少必需的输入、权限、安全边界或成功标准,请停下来寻求澄清。
兼容工具
Claude CodeCursor
标签
前端开发