本篇解析 example-flow-39.kt。学习如何让原本无法取消的流变为可取消。
1. 核心操作符:cancellable()
cancellable() 操作符会为流的每次发射添加一个 ensureActive() 检查。
代码解析
1 | fun main() = runBlocking { |
- 结果分析:与示例 38 不同,开启
cancellable()后,当收集到 3 并调用cancel()时,流会在发射 4 之前检测到取消,并立即停止。
2. 开发者感悟
cancellable 是一个“安全补丁”。当你使用的流构建器(如 asFlow)没有内置取消检测,且你的处理逻辑又非常繁忙且需要响应取消时,请务必加上它。
附录:Flow 系列总结
恭喜你!到这里你已经完成了 Flow 的全部核心教程。
Flow 处理黄金法则:
- 冷流原则:不收集,不运行。
- 异步流:在
flow { ... }中随意挂起,不阻塞线程。 - 线程调度:使用
flowOn改变上游,保持下游(collect)与调用者一致。 - 性能优化:用
buffer并发,用conflate或collectLatest处理过快数据。 - 异常安全:用
catch优雅处理错误,用onCompletion或finally释放资源。 - 生命周期:在 Android 中配合
LifecycleScope和launchIn监听数据,实现自动取消。