以下代码打印 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”,但不是最预期的。
这是设计使然吗?如果是,有什么好处?
subscribeOn在指定的线程上启动一个新的订阅链,但为了支持取消,它必须首先onSubscribe使用Disposable可以提前取消的 进行调用- 考虑在调用 之前使正在进行昂贵准备的异步源超时onSubscribe。从理论上讲,您也有可能在 3、4 和 1、2 之间进行各种交错。
| 归档时间: |
|
| 查看次数: |
2961 次 |
| 最近记录: |