Flow 进阶:15. 使用 flowOn 正确切换上下文

本篇解析 example-flow-15.kt。学习如何改变发射端的线程。

1. 核心操作符:flowOn

flowOn 是改变 Flow 发射上下文的唯一正确方式

工作原理:

  • 向上游生效flowOn 只会改变它之前(上游)的操作符或构建器的上下文。
  • 不影响下游:它不会改变 collect 或它之后的操作符的上下文。

2. 代码解析

1
2
3
4
5
6
7
8
9
10
11
12
fun simple(): Flow<Int> = flow {
for (i in 1..3) {
log("Emitting $i") // 这里运行在 Dispatchers.Default (由 flowOn 指定)
emit(i)
}
}.flowOn(Dispatchers.Default)

fun main() = runBlocking {
simple().collect { value ->
log("Collected $value") // 这里运行在 main (runBlocking 的上下文)
}
}

3. 开发者感悟

flowOn 实际上在后台创建了一个 Channel。它让发射端在线程 A 运行,收集端在线程 B 运行,实现了异步的并发生产和消费。在 Android 开发中,我们经常用它来在 IO 线程请求数据,然后在 Main 线程刷新 UI。

,