RxJava2操作符學習筆記

idealcn發表於2018-12-10

一切都是流

流是用來連線觀察者和被觀察者的.以電源和手機為例,電源好比被觀察者,手機就是觀察者,而各種操作符就好比是資料線,流就是電.如果只有資料線(操作符)連線電源(被觀察者)和手機(觀察者),而沒有電(流),那麼手機(觀察者)也無法被充電(收不到被觀察者的變化通知).同樣的,如果電源有電,和手機之間卻沒有資料線連線,手機同樣也無法被充電.資料線(操作符)確保電量(流)傳輸過程中不會中斷.在Rxjava2中,如果被觀察者在發射資料流的過程中發生了錯誤,可以直接在觀察者的onError中做接收,也可以使用別的操作符(比如:onErrorResumeNext)去攔截並處理這個錯誤後再交給觀察者去接收.

onErrorResumeNext

當一個Observable發生錯誤時,通知它轉移控制權給另一個Observable,而不是去觸發Observer的onError方法.用這個操作符可以統一處理介面請求時遇到的錯誤情況

    Observable.create()
            .onErrorResumeNext(throwable -> { 
            //在這裡,根據具體業務需求去處理不同的異常
                if (throwable instanceOf JsonExecption){
                    //通過error操作符將資料流繼續向觀察者方向傳遞,不然資料流就會中斷,那麼觀察者就不會收到通知
                   return Observable.error(Throwable("json錯誤")) 
                }
                  //通過error操作符將資料流繼續向觀察者方向傳遞,不然資料流就會中斷,那麼觀察者就不會收到通知
                return Observable.error(Throwable("未知錯誤資訊"))
            })

do系列操作符

1. doOnSubscribe

觀察者和被觀察者達成訂閱關係時,會首先觸發這個操作符.可以在這個地方顯示請求的dialog或者處理請求的前置業務.

2. doFinally

訂閱關係結束後會呼叫這個操作符.可以在這裡處理收尾任務,比如取消請求進度條的顯示,釋放一些可能會引發oom的物件引用等.

 private String name,password;
Observable.just()
.doOnSubscribe{
    name = tvName.getText().toString().trim();
    password = tvName.getText().toString().trim();
    showRequestProgress();
}
.doFinally{
    hideRequestProgress();
}
.subscribe(new Observer<User>(){
    //...
});

未完待續,每學習一個做一次更新,堅持下去.

相關文章