簡體   English   中英

RxJava-delay和delaySubscription有什么區別?

[英]RxJava - What is the difference between delay and delaySubscription?

我試圖了解delaydelaySubscription運算符之間的區別。

本文檔描述了延遲運算符:

延遲運算符通過在發出每個源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");
            }
        };

觀察者在這里訂閱了可觀察者:

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測試它-相同的行為。

以我的理解,顧名思義,不應延遲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

也許我做錯了-但我無法理解其中的區別。 您能否解釋一下delay和delaySubscription之間的區別?

您可以想象這是一場足球比賽,而信號源正在發出幀[ 熱門觀察 ]。

假設是一個實時流場景 ..在delay(3 seconds)情況下,打開頻道后,您將被訂閱,但會在實際發射3秒后收到第一幀,因此您將繼續觀看游戲延遲3秒。

delaySubscription(3 seconds)情況下,一旦打開頻道,您將等待3秒(丟失這3秒鍾內發射的任何幀),然后訂閱並開始實時接收其余幀

delaySubscription僅影響初始訂閱。 訂閱下游的Observable它會正常運行。

delayonNextonCompleteonError事件起作用,將onNext延遲指定的時間,但保持它們之間的相對延遲相同。

如果您使用比Observable.just少的可預測性的源,則差異將更加清楚

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM