我想了解延迟和 delaySubscription 运营商之间的区别。
This documentation描述了延迟运算符:
Delay运算符通过暂停a来修改其源Observable 在发出每个之前的特定时间增量(您指定) 源Observable的项目。这具有转移的效果 Observable及时向前发射的整个物品序列 指定的增量
delaySubscription描述如下:
还有一个运营商可以延迟订阅 来源Observable:delaySubscription。
但是,当我测试这两个操作符的行为时,在我看来他们的工作方式是一样的。
这是我的观察结果:
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
也许我做错了什么 - 但我无法理解其中的差异。你能解释一下延迟和延迟订阅之间的区别吗?
答案 0 :(得分:5)
你可以把它想象成一个足球比赛的流,而来源正在发出框架[一个热的可观察的]。
假设实时流方案 ..如果是delay(3 seconds)
,一旦打开频道,您就会订阅,但会在3秒后收到第一帧它的实际发射量,所以你将继续观看比赛延迟3秒。
如果是delaySubscription(3 seconds)
,一旦打开频道,您将等待3秒钟(在这3秒内丢失任何帧),然后订阅并开始实时接收剩余的帧< / p>
答案 1 :(得分:2)
delaySubscription
仅影响初始订阅。订阅了下游Observable
之后,它正常运作。
delay
适用于onNext
,onComplete
和onError
事件,在指定的时间内延迟这些事件,但保持它们之间的相对延迟相同。< / p>
如果您使用的可预测源不是Observable.just
答案 2 :(得分:0)
当您查看一个在另一个下面的操作员时(就像您发布的那样),这是非常清楚的。通常,当订阅延迟时,您会“松开”红色和橙色大理石。与延迟相比,延迟会给您带来延迟。