Flow 监听:35. Collect 的阻塞性

本篇解析 example-flow-35.kt。探讨如何在不阻塞当前协程的情况下监听 Flow。

1. 核心问题:Collect 是挂起并等待的

collect 是一个末端操作符,它会挂起当前协程,直到 Flow 所有的值都被收集完成。

代码解析

1
2
3
4
events()
.onEach { event -> println("Event: $event") }
.collect() // 这里会一直挂起等待
println("Done") // 只有等 flow 结束(通常是 300ms 后),才会打印 "Done"

2. 开发者感悟

如果你在处理 UI 事件流(比如按钮点击或 Socket 消息),直接使用 collect 会导致其后的代码无法执行。这就像是你守在一个窗口前,不等到人(流结束)就不走开。为了解决这个问题,我们需要 launchIn

,