当我在flatMap中更改返回的Observable的调度程序时,你能解释为什么我会得到奇怪的输出吗?例如,我有
Observable.range(1, 9)
.flatMap {
if (it < 5) {
Observable.just(it)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
} else {
Observable.just(it)
}
}
.subscribe({ println("${it}: ${Thread.currentThread().name}") })
println("END")
Thread.sleep(200)
作为输出,我在每次运行时都有不同的结果。例如。 第一次发布
1: RxCachedThreadScheduler-3
2: RxCachedThreadScheduler-3
3: RxCachedThreadScheduler-3
5: main
6: main
7: main
END
4: RxCachedThreadScheduler-6
8: RxCachedThreadScheduler-6
9: RxCachedThreadScheduler-6
第二次发射输出:
5: main
1: main
2: main
3: main
6: main
7: main
8: main
9: main
END
4: RxCachedThreadScheduler-8
答案 0 :(得分:3)
flatMap
非确定地合并其中一个参与线程,因此即使内部源已定义subscribeOn
和/或observeOn
,也无法保证哪个线程会赢得从源头发出物品的特定时刻。因此,如果要确保在所需的线程上发生后续事件处理(直到有另一个异步边界运算符),则必须在observeOn
之后应用flatMap
。