本篇解析 example-flow-18.kt。学习如何处理消费能力严重不足的情况。
1. 核心操作符:conflate()
当收集器处理速度远慢于发射速度时,如果你不关心中间值,只想要最新的数据,可以使用 conflate()。
工作原理:
- 跳过中间值:当收集器正在忙于处理一个元素时,如果发射端又产出了多个新值,
conflate会直接丢弃旧的中间值,只保留最新的那一个。 - 不阻塞发射:发射端可以一直运行,不需要等待收集端。
2. 代码解析
1 | simple() |
- 100ms:发射 1,收集端开始处理 1(耗时 300ms)。
- 200ms:发射 2,由于收集端在忙,2 被放入暂存。
- 300ms:发射 3,由于收集端还在忙,2 被丢弃,3 替代 2 成为最新值。
- 400ms:收集端处理完 1,立即开始处理最新的 3。
- 结果:只打印了 1 和 3,中间的 2 被“合并”掉了。
3. 开发者感悟
conflate 非常适合处理高频更新的 UI 状态。例如:股票行情或进度条更新。用户不需要看到每一个细微的数字变化,他们只需要看到当前的最新状态即可。这能极大减轻 UI 线程的压力。