Flow 取消:39. 使用 cancellable 启用取消检查

本篇解析 example-flow-39.kt。学习如何让原本无法取消的流变为可取消。

1. 核心操作符:cancellable()

cancellable() 操作符会为流的每次发射添加一个 ensureActive() 检查。

代码解析

1
2
3
4
5
6
7
8
fun main() = runBlocking {
(1..5).asFlow()
.cancellable() // 手动开启取消检测
.collect { value ->
if (value == 3) cancel()
println(value)
}
}
  • 结果分析:与示例 38 不同,开启 cancellable() 后,当收集到 3 并调用 cancel() 时,流会在发射 4 之前检测到取消,并立即停止。

2. 开发者感悟

cancellable 是一个“安全补丁”。当你使用的流构建器(如 asFlow)没有内置取消检测,且你的处理逻辑又非常繁忙且需要响应取消时,请务必加上它。


附录:Flow 系列总结

恭喜你!到这里你已经完成了 Flow 的全部核心教程。

Flow 处理黄金法则:

  1. 冷流原则:不收集,不运行。
  2. 异步流:在 flow { ... } 中随意挂起,不阻塞线程。
  3. 线程调度:使用 flowOn 改变上游,保持下游(collect)与调用者一致。
  4. 性能优化:用 buffer 并发,用 conflatecollectLatest 处理过快数据。
  5. 异常安全:用 catch 优雅处理错误,用 onCompletionfinally 释放资源。
  6. 生命周期:在 Android 中配合 LifecycleScopelaunchIn 监听数据,实现自动取消。
,