我试图理解 delay 和 delaySubscription 运算符之间的区别。
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
delaySubscription的描述如下:
There is also an operator with which you can delay the subscription to the source 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);
结果,当我使用 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/