本篇解析 example-flow-06.kt。探讨 Flow 如何响应取消信号。
1. 核心机制:协作取消
Flow 的取消遵循协程的协作取消原则。
代码解析
1 | fun main() = runBlocking { |
simple()每 100ms 发射一次数据。- 当 250ms 到达时,
withTimeoutOrNull会取消collect所在的协程。 - 由于
simple()内部包含delay(可取消的挂起函数),Flow 收集会立即停止并退出。
2. 开发者感悟
Flow 的取消非常直观:取消收集者所在的协程,Flow 就会停止产出。这在 Android 界面销毁(如 onDestroy)时自动停止数据流更新非常有用。
3. 注意点
如果你的 flow { ... } 内部全都是 CPU 密集型的计算且没有调用任何挂起函数(如 delay 或 yield),你需要像处理普通协程一样,手动检查 currentCoroutineContext().isActive 状态。