gpt4 book ai didi

rx-java - 为什么 RxJava2 doOnSubscribe 运行顺序困惑?

转载 作者:行者123 更新时间:2023-12-02 20:36:13 25 4
gpt4 key购买 nike

以下代码打印 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”,但不是大多数人的预期。

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

最佳答案

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

关于rx-java - 为什么 RxJava2 doOnSubscribe 运行顺序困惑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47027164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com