flatMap()observable上的调度程序是否会影响外部observable上的调度程序?

Spa*_*rky 2 rx-java rx-java2

这看起来有点像一个愚蠢的问题,我已经做了一些测试,看看它在实践中是如何工作的,但我希望看到它得到确认,如果可能的话,我想知道为什么就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()
Run Code Online (Sandbox Code Playgroud)

那么操作员是否.doOnNext(i -> System.out.println(String.format("Got %d", i)))会执行schedulerA或者schedulerB是否存在正式或基于规范的原因?

谢谢.

aka*_*okd 5

无法保证doOnNext将运行哪个调度程序.它可以是概率方式中的任何一个.

这样做的原因是flatMap操作员使用先进的快速路径和工作窃取算法,该算法可以由任一线程触发,并且还将执行另一个线程的一些任务.

随着琐碎的内部Observable快速完成,可能schedulerA仍然可以处理其订阅并检测到来自内部源的值是可用的,从而在同一schedulerA线程上发出它.其他时候,在生成物品之前schedulerA完成处理内部Observable.在那种情况下,schedulerB会触发内部的发射flatMap.

通常,当您不确定哪个线程将处理您的时doOnNext,请始终observeOn在其之前应用所需的调度程序.