SuperAPI AI 工具集

kotlin-coroutines-flows

编程与开发

查看项目

更新于 10-15 08:38

技能介绍

用途

该技能面向 Android 与 Kotlin Multiplatform(KMP)项目,提供 Kotlin 协程(Coroutines)与 Flow 的实践模式,用于编写异步代码、构建基于 Flow 的响应式数据流,以及进行协程测试。

主要能力

结构化并发

  • 作用域层级:Application → viewModelScope(ViewModel)→ coroutineScope { }(结构化子作用域)→ async { }(并发任务)。
  • 始终使用结构化并发,避免 GlobalScope;推荐使用 viewModelScope.launch 或 LaunchedEffect(key)。
  • 并行分解:使用 coroutineScope + async 并行执行任务,再通过 await() 汇总结果。
  • supervisorScope:当子任务失败不应取消同级任务时使用。

Flow 模式

  • 冷流:将一次性调用转换为数据流,数据库变化时重新发射。
  • StateFlow 用于 UI 状态:通过 stateIn 配合 SharingStarted.WhileSubscribed(5_000),在最后一个订阅者离开后保持上游活跃 5 秒,从而在配置变更时无需重启。
  • 组合多个 Flow:使用 combine 将多个数据源合并为 UI 状态。
  • Flow 操作符:debounce(防抖)、distinctUntilChanged、flatMapLatest、catch、retryWhen(指数退避重试)。
  • SharedFlow 用于一次性事件:如显示 Snackbar、导航等副作用,在 Composable 中通过 LaunchedEffect 收集。

调度器

  • Dispatchers.Default 用于 CPU 密集型工作。
  • Dispatchers.IO 用于 IO 密集型工作(仅 JVM/Android)。
  • Dispatchers.Main 用于主线程(UI)。
  • 在 KMP 中,使用 Dispatchers.Default 和 Dispatchers.Main(所有平台可用);Dispatchers.IO 仅限 JVM/Android,其他平台使用 Dispatchers.Default 或通过依赖注入提供。

取消

  • 协作式取消:长时间运行的循环需调用 ensureActive() 检查取消状态。
  • 使用 try/finally 进行清理,finally 块在取消时也会执行。

测试

  • 使用 Turbine 测试 StateFlow:通过 runTest 与 state.test { } 断言状态变化序列。
  • 使用 TestDispatcher:通过 advanceUntilIdle() 推进协程执行。
  • 伪造 Flow:使用 MutableStateFlow 实现 Fake 仓库,便于测试。

使用方式

该技能以模式与代码示例形式提供,涵盖上述各类场景的推荐写法与反模式。使用时根据具体场景(如并行加载、防抖搜索、重试、UI 状态管理、一次性事件、测试)参考对应模式。

适用场景

  • 使用 Kotlin 协程编写异步代码。
  • 使用 Flow、StateFlow 或 SharedFlow 处理响应式数据。
  • 处理并发操作(并行加载、防抖、重试)。
  • 测试协程与 Flow。
  • 管理协程作用域与取消。

限制与反模式

应避免以下反模式:

  • 使用 GlobalScope——会泄漏协程,且无结构化取消。
  • 在 init {} 中收集 Flow 而不使用作用域——应使用 viewModelScope.launch。
  • 使用 MutableStateFlow 配合可变集合——应始终使用不可变副本:_state.update { it.copy(list = it.list + newItem) }。
  • 捕获 CancellationException——应让其传播以实现正确的取消。
  • 使用 flowOn(Dispatchers.Main) 进行收集——收集调度器是调用者的调度器。
  • 在 @Composable 中创建 Flow 而不使用 remember——每次重组都会重新创建 Flow。

相关参考

  • 参见技能 compose-multiplatform-patterns,了解 Flow 在 UI 中的消费方式。
  • 参见技能 android-clean-architecture,了解协程在分层架构中的位置。