java - RxJava - 延迟和延迟订阅之间有什么区别?

标签 java rx-java rx-java2

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

This documentation描述延迟运算符:

The Delay operator modifies its source Observable by pausing for a particular increment of time (that you specify) before emitting each of the source Observable’s items. This has the effect of shifting the entire sequence of items emitted by the Observable forward in time by that specified increment

enter image description here

delaySubscription的描述如下:

There is also an operator with which you can delay the subscription to the source 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);

结果,当我使用 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

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

最佳答案

您可以将其想象为一场足球比赛的流,并且源正在发出帧[热可观察]。

假设实时流场景 .. 如果出现延迟(3秒),一旦您打开 channel ,您将被订阅,但会收到第一帧在实际发射 3 秒后显示,因此您将继续观看游戏,延迟 3 秒。

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

关于java - RxJava - 延迟和延迟订阅之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49476105/

相关文章:

java - 如何将在一个方法中初始化的变量使用到另一个类的另一个方法中

java - 如何将 SQL 查询转换为 HQL

Android O 后台服务生命周期影响 RxJava Observable?

java - RxJava : how to use Observable instead nested loops?

java - 如何使用 ReplaySubject 重新运行 CompositeSubscription?

java - RxJava2 - 在并行轨道上发出 onError 将得到 UndeliverableException

kotlin - RxJava2 Kotlin SwitchMap 从 RealmResults 到 Observable

java - java2d 对象的非破坏性转换

java - 是否可以在子目录中(而不是在项目根目录中)定义 pom.xml ?

java - 如何在单元测试中处理模拟的 RxJava2 可观察抛出异常