Flow 基础:06. 异步流的取消

本篇解析 example-flow-06.kt。探讨 Flow 如何响应取消信号。

1. 核心机制:协作取消

Flow 的取消遵循协程的协作取消原则。

代码解析

1
2
3
4
5
6
fun main() = runBlocking {
withTimeoutOrNull(250) { // 在 250ms 后超时取消
simple().collect { value -> println(value) }
}
println("Done")
}
  • simple() 每 100ms 发射一次数据。
  • 当 250ms 到达时,withTimeoutOrNull 会取消 collect 所在的协程。
  • 由于 simple() 内部包含 delay(可取消的挂起函数),Flow 收集会立即停止并退出。

2. 开发者感悟

Flow 的取消非常直观:取消收集者所在的协程,Flow 就会停止产出。这在 Android 界面销毁(如 onDestroy)时自动停止数据流更新非常有用。

3. 注意点

如果你的 flow { ... } 内部全都是 CPU 密集型的计算且没有调用任何挂起函数(如 delayyield),你需要像处理普通协程一样,手动检查 currentCoroutineContext().isActive 状态。

,