以下代码打印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”,但不是预期的最多。
这种行为是否符合设计要求?如果是的话,有什么好处?
答案 0 :(得分:3)
subscribeOn
在指定的帖子上启动新的订阅链,但为了支持取消,必须先调用onSubscribe
并Disposable
可以提前取消 - 考虑一下在调用onSubscribe
之前超时执行昂贵准备的异步源。从理论上讲,你也可以在3,4和1,2之间进行各种交错。