RxJava - 延迟和delaySubscription有什么区别?

时间:2018-03-25 12:59:07

标签: java rx-java rx-java2

我想了解延迟 delaySubscription 运营商之间的区别。

This documentation描述了延迟运算符:

  

Delay运算符通过暂停a来修改其源Observable   在发出每个之前的特定时间增量(您指定)   源Observable的项目。这具有转移的效果   Observable及时向前发射的整个物品序列   指定的增量

enter image description here

delaySubscription描述如下:

  

还有一个运营商可以延迟订阅   来源Observable:delaySubscription。

enter image description here

但是,当我测试这两个操作符的行为时,在我看来他们的工作方式是一样的。

这是我的观察结果:

Observable observable = Observable.just(5, 3, 4, 2);

我在这里使用延迟运算符:

observable = observable.delay(3, TimeUnit.SECONDS);

这是我的观察者,当其中一个方法叫做

时会记录
Observer observer = new Observer() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.d("RxJavaTag", "onSubscribe");
            }

            @Override
            public void onNext(Object o) {
                Log.d("RxJavaTag", "onNext: " + o);
            }

            @Override
            public void onError(Throwable e) {
                Log.d("RxJavaTag", "onError:" + e.toString());
            }

            @Override
            public void onComplete() {
                Log.d("RxJavaTag", "onComplete");
            }
        };

Observer正在订阅Observable:

observable.subscribe(observer);

结果,当我使用延迟运算符时,我收到以下日志:

03-25 17:45:34.156 onSubscribe
03-25 17:45:37.160 onNext: 5
03-25 17:45:37.160 onNext: 3
03-25 17:45:37.160 onNext: 4
03-25 17:45:37.160 onNext: 2
03-25 17:45:37.160 onComplete

使用 delaySubscription 运算符时的以下日志:

03-25 17:49:22.540 onSubscribe
03-25 17:49:25.544 onNext: 5
03-25 17:49:25.544 onNext: 3
03-25 17:49:25.544 onNext: 4
03-25 17:49:25.544 onNext: 2
03-25 17:49:25.544 onComplete

正如您在日志中看到的那样,它们的工作方式相同。我无法理解它们之间的区别。我尝试用ConnectableObservable测试它 - 行为相同。

根据我的理解,顾名思义,不应该 delaySubscription 运算符以这种方式工作:

[SOME DELAY - FOR EXAMPLE 3 SECONDS]
03-25 17:49:25.540 onSubscribe
03-25 17:49:25.544 onNext: 5
03-25 17:49:25.544 onNext: 3
03-25 17:49:25.544 onNext: 4
03-25 17:49:25.544 onNext: 2
03-25 17:49:25.544 onComplete

也许我做错了什么 - 但我无法理解其中的差异。你能解释一下延迟和延迟订阅之间的区别吗?

3 个答案:

答案 0 :(得分:5)

你可以把它想象成一个足球比赛的流,而来源正在发出框架[一个热的可观察的]。

假设实时流方案 ..如果是delay(3 seconds),一旦打开频道,您就会订阅,但会在3秒后收到第一帧它的实际发射量,所以你将继续观看比赛延迟3秒。

如果是delaySubscription(3 seconds),一旦打开频道,您将等待3秒钟(在这3秒内丢失任何帧),然后订阅并开始实时接收剩余的帧< / p>

答案 1 :(得分:2)

delaySubscription仅影响初始订阅。订阅了下游Observable之后,它正常运作。

delay适用于onNextonCompleteonError事件,在指定的时间内延迟这些事件,但保持它们之间的相对延迟相同。< / p>

如果您使用的可预测源不是Observable.just

,则差异会更明显

答案 2 :(得分:0)

当您查看一个在另一个下面的操作员时(就像您发布的那样),这是非常清楚的。通常,当订阅延迟时,您会“松开”红色和橙色大理石。与延迟相比,延迟会给您带来延迟。