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

时间:2017-10-31 02:54:37

标签: rx-java rx-java2

以下代码打印1,2

Observable.just(1)
    .doOnSubscribe(d -> System.out.println(1))
    .doOnSubscribe(d -> System.out.println(2))
    .blockingSubscribe();

此印刷品2,1

Observable.just(1)
    .doOnSubscribe(d -> System.out.println(1))
    .subscribeOn(Schedulers.newThread())
    .doOnSubscribe(d -> System.out.println(2))
    .blockingSubscribe();

在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();

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

这种行为是否符合设计要求?如果是的话,有什么好处?

1 个答案:

答案 0 :(得分:3)

subscribeOn在指定的帖子上启动新的订阅链,但为了支持取消,必须先调用onSubscribeDisposable可以提前取消 - 考虑一下在调用onSubscribe之前超时执行昂贵准备的异步源。从理论上讲,你也可以在3,4和1,2之间进行各种交错。