这似乎是一个愚蠢的问题,我已经进行了一些测试以查看其在实践中的工作方式,但是我希望看到它得到证实,并且如果可能的话,我想知道为什么在Observable合同及其实施,因为在我对Rx规则的理解中,这就像一个令人讨厌的漏洞。另外,如果您可以告诉我在哪里可以找到它,那么它将在以后帮助我自己回答这些问题。
如果我使用以下Observable:
Observable.range(0, 3)
.observeOn(schedulerA)
.flatMap(i -> Observable.just(i)
.observeOn(schedulerB)
.map(j -> -j))
.doOnNext(i -> System.out.println(String.format("Got %d", i)))
.subscribe()
然后,运算符
.doOnNext(i -> System.out.println(String.format("Got %d", i)))
将在schedulerA
或schedulerB
上执行,为什么有基于形式或规范的原因?谢谢。
最佳答案
无法保证将在哪个调度程序doOnNext
上运行。以概率的方式可能是其中之一。
其原因是flatMap
运算符使用高级的快速路径和工作窃取算法,该算法可以由任一线程触发,并且也可以执行另一线程的某些任务。
随着琐碎的内部Observable
快速完成,可能schedulerA
仍在处理其预订并检测到内部源的值可用,从而在同一schedulerA
线程上发出该值。有时,schedulerA
在处理内部Observable
之前会完成处理,然后再生成项目。在这种情况下,schedulerB
将触发flatMap
内部的发射。
通常,当您不确定哪个线程将处理您的doOnNext
时,请始终在所需的调度程序之前应用observeOn
。
关于rx-java - flatMap()上可观察的调度程序会影响外部可观察到的调度程序吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51677721/