RxJava從入門到不離不棄(五)——do操作符

好久沒有更新RxJava系列文章了,今天整理一番do系列操作符與大家分享。

對於do系列操作符理解比較容易,他相當於給Observable執行週期的關鍵節點添加回調。當Observable執行到這個階段的時候,這些回調就會被觸發。

在Rxjava do系列操作符有多個,如doOnNext,doOnSubscribe,doOnUnsubscribe,doOnCompleted,doOnError,doOnTerminate和doOnEach。

當Observable每發送一個數據時,doOnNext會被首先調用,然後再onNext。若發射中途出現異常doOnError會被調用,然後onError。若數據正常發送完畢doOnCompleted會被觸發,然後執行onCompleted。當訂閱或者解除訂閱doOnSubscribe,doOnUnsubscribe會被執行。

舉個例子:

        Observable.just(1, 2, 3)
                .doOnNext(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        Log.e(TAG, "doOnNext: " );
                    }
                })
                .doOnError(new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                        Log.e(TAG, "doOnError: " );
                    }
                })
                .doOnCompleted(new Action0() {
                    @Override
                    public void call() {
                        Log.e(TAG, "doOnCompleted: " );
                    }
                })
                .doOnSubscribe(new Action0() {
                    @Override
                    public void call() {
                        Log.e(TAG, "doOnSubscribe: " );
                    }
                })
                .doOnUnsubscribe(new Action0() {
                    @Override
                    public void call() {
                        Log.e(TAG, "doOnUnsubscribe: " );
                    }
                })
                .doOnTerminate(new Action0() {
                    @Override
                    public void call() {
                        Log.e(TAG, "doOnTerminate: " );
                    }
                })
                .doAfterTerminate(new Action0() {
                    @Override
                    public void call() {
                        Log.e(TAG, "doAfterTerminate: " );
                    }
                })
                .subscribe(new Subscriber<Integer>() {
                    @Override
                    public void onCompleted() {
                        Log.e(TAG, "onCompleted1: ");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e(TAG, "onError1: ");
                    }

                    @Override
                    public void onNext(Integer integer) {
                        Log.e(TAG, "onNext1: " + integer);
                    }
                });

輸出結果:

doOnSubscribe: 
doOnNext: 
onNext1: 1
doOnNext: 
onNext1: 2
doOnNext: 
onNext1: 3
doOnCompleted: 
doOnTerminate: 
onCompleted1: 
doOnUnsubscribe: 
doAfterTerminate:

這裏要特殊介紹到一個操作符——就是doOnEach:

doOnEach顧名思義,就是在執行觀察者的每一個方法之前,都會先執行一遍doOnNext。這裏的doOnEach傳入一個Subscriber參數,需要實現其三個對應方法,具體參照一下代碼:

        Observable.just(1,2,3)
                .doOnEach(new Subscriber<Integer>() {
                    @Override
                    public void onCompleted() {
                        Log.e(TAG, "onCompleted: " );
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e(TAG, "onError: " );
                    }

                    @Override
                    public void onNext(Integer integer) {
                        Log.e(TAG, "onNext: "+integer);
                    }
                }).subscribe(new Subscriber<Integer>() {
            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted1: " );
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError1: " );
            }

            @Override
            public void onNext(Integer integer) {
                Log.e(TAG, "onNext1: "+integer);
            }
        });

輸出結果:

onNext: 1
onNext1: 1
onNext: 2
onNext1: 2
onNext: 3
onNext1: 3
onCompleted: 
onCompleted1: 

do系列操作符相對簡單,就不做過多介紹了。

更多精彩內容,歡迎關注我的微信公衆號——Android機動車

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