【问题标题】:RxJava - What is the difference between delay and delaySubscription?RxJava - 延迟和延迟订阅有什么区别?
【发布时间】:2018-09-03 16:35:43
【问题描述】:

我正在尝试了解 delaydelaySubscription 运算符之间的区别。

This documentation 描述 delay 运算符:

Delay 操作符通过暂停一个 在发射每个之前的特定时间增量(您指定) 源 Observable 的项目。这具有转移 Observable 发出的整个项目序列在时间上向前 那个指定的增量

delaySubscription 是这样描述的:

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

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

这是我的观察:

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

这里我使用 delay 运算符:

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);

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

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

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

【问题讨论】:

    标签: java rx-java rx-java2


    【解决方案1】:

    delaySubscription 仅影响初始订阅。在它订阅了下游Observable 之后,它就可以正常运行了。

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

    如果您使用比Observable.just 更难预测的来源,差异会更明显

    【讨论】:

    • 感谢您的回答。您写了“延迟订阅仅影响初始订阅”。但正如您在日志中看到的,它不会影响订阅。 “比 Observable.just 更难预测的来源”是什么意思?能树立榜样就好了
    • 更改onSubscribe 的操作员只会在链上进行更改。由于您的日志记录操作在观察者中,因此不受影响。如果您在延迟之前将日志记录操作放在doOnSubscribe 操作中,它应该是可见的。
    【解决方案2】:

    你可以把它想象成一个足球比赛的流,源是发射帧 [A hot observable]。

    假设是实时流场景 .. 在delay(3 seconds) 的情况下,一旦您打开频道,您将被订阅,但会在实际发射 3 秒后收到第一帧,因此您将延迟 3 秒继续观看比赛。

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

    【讨论】:

    • 这是一个非常简洁的解释。谢谢!
    【解决方案3】:

    当您查看运算符时,您会很清楚地看到另一个(就像您发布的那样)。通常,当订阅延迟时,您会“松开”红色和橙色的弹珠。与延迟相比,延迟会给您带来延迟。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      • 2020-01-24
      • 1970-01-01
      • 2015-09-14
      • 2016-02-07
      相关资源
      最近更新 更多