Rxjava2中Concat操作符onNext,OnError,OnComplte的執行順序

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/m0_37559046/article/details/75049185

本文只是通過例子,把concat操作符中自定義Observable中onNext,onError,onComplte在subscribe後的執行順序打印出來給大家看看.(concat操作符的作用是連接操作符,可接受Observable的可變參數,或者Observable的集合然後順序的發送出去,注意是有序的發送,那麼這個就可以應用在開發中很多有序的事件,比如接廣告…)

廢話不多說,我們先看下沒有執行之前的代碼

observable1

Observable<Integer> observable1 = Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {

                e.onNext(1);
                LogUtil.d("Emitter : 1");
                e.onNext(2);
                LogUtil.d("Emitter : 2");
                e.onComplete();
                LogUtil.d("onComplete1");
            }
        });

observable2

 Observable<Integer> observable2 = Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {

                e.onNext(3);
                LogUtil.d("Emitter : 3");
                e.onNext(4);
                LogUtil.d("Emitter : 4");
                e.onComplete();
                LogUtil.d("onComplete2");
            }
        });

subscribe

   Observable.concat(observable1, observable2)
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(@NonNull Integer integer) throws Exception {
                        LogUtil.d("onNext : " + integer + "\n");
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(@NonNull Throwable throwable) throws Exception {
                        LogUtil.d("Throwable");
                    }
                }, new Action() {
                    @Override
                    public void run() throws Exception {
                        LogUtil.d("onComplete");
                    }
                });

OK,那麼我們首先運行一下,看下是什麼結果…

 D/leo: onNext : 1
 D/leo: Emitter : 1
 D/leo: onNext : 2
 D/leo: Emitter : 2
 D/leo: onComplete1
 D/leo: onNext : 3
 D/leo: Emitter : 3
 D/leo: onNext : 4
 D/leo: Emitter : 4
 D/leo: onComplete2
 D/leo: onComplete

一切都很正常,如果我們把1中的onComplete取消掉呢?

Observable<Integer> observable1 = Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {

                e.onNext(1);
                LogUtil.d("Emitter : 1");
                e.onNext(2);
                LogUtil.d("Emitter : 2");
                  //e.onComplete();
                  // LogUtil.d("onComplete1");
            }
        });

結果是

 D/leo: onNext : 1
 D/leo: Emitter : 1
 D/leo: onNext : 2
 D/leo: Emitter : 2

結論:如果自定義Observable使用在Concat中,如果要想執行下一個Observable那麼前一個Obeservable必須要執行onComplete方法

如果1中的onComplete放開,2中onComplete註釋掉的話:

  Observable<Integer> observable2 = Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {

                e.onNext(3);
                LogUtil.d("Emitter : 3");
                e.onNext(4);
                LogUtil.d("Emitter : 4");
               // e.onComplete();
                //LogUtil.d("onComplete2");
            }
        });

結果是:

 D/leo: onNext : 1
 D/leo: Emitter : 1
 D/leo: onNext : 2
 D/leo: Emitter : 2
 D/leo: onComplete1
 D/leo: onNext : 3
 D/leo: Emitter : 3
 D/leo: onNext : 4
 D/leo: Emitter : 4

結論:concat中所有的Observable都要走完onComplete方法,不然 subscribe中的onComplete將不會執行

如果將1中的onComplete放在onNext(2)之前:

    Observable<Integer> observable1 = Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {

                e.onNext(1);
                LogUtil.d("Emitter : 1");
                e.onComplete();
                LogUtil.d("onComplete1");
                e.onNext(2);
                LogUtil.d("Emitter : 2");
            }
        });

結果是:

D/leo: onNext : 1
D/leo: Emitter : 1
D/leo: onComplete1
D/leo: Emitter : 2
D/leo: onNext : 3
D/leo: Emitter : 3
D/leo: onNext : 4
D/leo: Emitter : 4
D/leo: onComplete2
D/leo: onComplete

結論:自定義observable中 onComplete方法後的onNext會發送 但是subscribe並不會接受到.

我們把1,2中的onComplete之前加onError方法呢:

        1.      e.onNext(1);
                LogUtil.d("Emitter : 1");
                e.onNext(2);
                LogUtil.d("Emitter : 2");
                e.onError(new AndroidException("error"));
                LogUtil.d("error1");
                e.onComplete();
                LogUtil.d("onComplete1");

        2.      e.onNext(3);
                LogUtil.d("Emitter : 3");
                e.onNext(4);
                LogUtil.d("Emitter : 4");
                e.onError(new AndroidException("error"));
                LogUtil.d("error2");
                e.onComplete();
                LogUtil.d("onComplete2");

結果是:

 D/leo: onNext : 1
 D/leo: Emitter : 1
 D/leo: onNext : 2
 D/leo: Emitter : 2
 D/leo: error1
 D/leo: onComplete1
 D/leo: Throwable

結論:onError方法走後,後面的方法會發送 但是不會被subscribe接受 而後面的Observable將不會被執行

那如果把1中的onComplete放在onError之前呢 會發生什麼:

                e.onNext(1);
                LogUtil.d("Emitter : 1");
                e.onNext(2);
                LogUtil.d("Emitter : 2");
                e.onComplete();
                LogUtil.d("onComplete1");
                e.onError(new AndroidException("error"));
                LogUtil.d("error1");

首選結果是:

 D/leo: onNext : 1
 D/leo: Emitter : 1
 D/leo: onNext : 2
 D/leo: Emitter : 2
 D/leo: onComplete1

但是同時APP直接崩潰了,並且報了一個錯誤

    io.reactivex.exceptions.UndeliverableException: android.util.AndroidException: error

這個錯誤在同時有兩個onError也會報(這樣的情況我之前遇到過,在接廣告的時候 我在廣告SDK返回adFailed方法中調用了onError),這個錯誤我暫時的理解是 onComplete執行後 自身的Observable不再有發送onError的能力 同時 OnError執行後不再有發送OnError的能力 就會報這個錯誤 如果有遇到這個錯誤 那麼請檢查自己Observable裏面有沒有這樣的順序.

暫時先寫到這裏,因爲馬上要吃飯了,12:00 ,寫這個的目的只是爲了做個記錄順便幫助到要了解這塊的同志. 如果有錯誤的地方還請指出,我將及時修改 如果有沒考慮到的地方 也請聯繫我讓我寫上去:QQ/WX:15921449923.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章