RxJava-delay和delaySubscription有什么区别?

Joe*_*mov 3 java rx-java rx-java2

我试图了解delaydelaySubscription运算符之间的区别。

本文档描述了延迟运算符:

延迟运算符通过在发出每个源Observable项目之前暂停特定的时间增量(由您指定)来修改其源Observable。这样的效果是将Observable发出的整个项目序列按时间向前移动指定的增量

在此处输入图片说明

delaySubscription的描述如下:

还有一个运算符,可用于延迟对源Observable的订阅:delaySubscription。

在此处输入图片说明

但是,当我测试这两个运算符的行为时,在我看来它们的工作方式相同。

这是我的观察:

Observable observable = Observable.just(5, 3, 4, 2);
Run Code Online (Sandbox Code Playgroud)

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

observable = observable.delay(3, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)

这是我的观察者,它记录何时调用其方法之一

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");
            }
        };
Run Code Online (Sandbox Code Playgroud)

观察者在这里订阅了可观察者:

observable.subscribe(observer);
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

以及使用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
Run Code Online (Sandbox Code Playgroud)

正如您在日志中看到的那样,它们以相同的方式工作。我不明白他们之间的区别。我尝试使用ConnectableObservable测试它-相同的行为。

以我的理解,顾名思义,不应延迟Subscription运算符以这种方式工作:

[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
Run Code Online (Sandbox Code Playgroud)

也许我做错了-但我无法理解其中的区别。您能否解释一下delay和delaySubscription之间的区别?

y.a*_*lam 10

您可以将其想象为橄榄球比赛的源流,并且信号源正在发射帧[ 热点可观察 ]。

假设是实时流场景。如果是delay(3 seconds),则打开频道后即可订阅,但在实际发射3秒后会收到第一帧,因此您将继续观看游戏,但要延迟3秒。

如果是delaySubscription(3 seconds),打开频道后,您将等待3秒(这3秒钟内缺少任何发射的帧),然后订阅并开始实时接收其余帧


Kis*_*kae 5

delaySubscription仅影响初始订阅。在它订阅了下游之后,它会Observable像往常一样运行。

delay适用于onNext,onCompleteonError事件,将它们延迟指定的时间,但保持它们之间的相对延迟相同。

如果您使用可预测性较差的来源,则差异会更明显 Observable.just