好久沒有更新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機動車