为什么 RxJava2 doOnSubscribe 以混乱的顺序运行?

Dea*_* Xu 2 rx-java rx-java2

以下代码打印 1、2

Observable.just(1)
    .doOnSubscribe(d -> System.out.println(1))
    .doOnSubscribe(d -> System.out.println(2))
    .blockingSubscribe();
Run Code Online (Sandbox Code Playgroud)

这个打印 2, 1

Observable.just(1)
    .doOnSubscribe(d -> System.out.println(1))
    .subscribeOn(Schedulers.newThread())
    .doOnSubscribe(d -> System.out.println(2))
    .blockingSubscribe();
Run Code Online (Sandbox Code Playgroud)

在 RxJava1 中,这两个代码都打印“2, 1”,因为doOnSubscribe在下游订阅上游之前调用。

在 RxJava2 中,订阅是从上游到下游 ( Observer.onSubscribe),但doOnSubscribe仍会在订阅之前调用。于是混乱的秩序出现了。

即使我可以给出一个更混乱的情况:

Observable.just(1)
    .doOnSubscribe(d -> System.out.println(1))
    .doOnSubscribe(d -> System.out.println(2))
    .subscribeOn(Schedulers.newThread())
    .doOnSubscribe(d -> System.out.println(3))
    .doOnSubscribe(d -> System.out.println(4))
    .blockingSubscribe();
Run Code Online (Sandbox Code Playgroud)

它按照我的预期打印“3, 4, 1, 2”,但不是最预期的。

这是设计使然吗?如果是,有什么好处?

aka*_*okd 5

subscribeOn在指定的线程上启动一个新的订阅链,但为了支持取消,它必须首先onSubscribe使用Disposable可以提前取消的 进行调用- 考虑在调用 之前使正在进行昂贵准备的异步源超时onSubscribe。从理论上讲,您也有可能在 3、4 和 1、2 之间进行各种交错。