RxJava 錯誤處理

Rx中, 很容易處理異常, 整個鏈式調用過程中,如果異常不做處理, 最后都會交給onError;

不要過渡的依賴onError; onError應該是在數據實在是無法處理的情況下,才被調用; 因為onError一旦被調用, 即意味著整個事件流結束;

在傳統的Java中, 一般產生異常, 可以自己決定處理或者拋出, 在Rx中也類似, 可以自己決定在產生異常后, 如何處理;

Catch

和傳統Java中Catch類似, 獲取異常,然后自行決定如何處理;

onErrorReturn

onErrorReturn操作符作用: 當發生錯誤是, 發送一個默認值,然后結束數據流(即調用onComplete); 使用后,Subscribe的onError方法不會被調用,會正常的調用onComplete結束;

onErrorReturn.png
onErrorResumeNext

onErrorResumeNext操作符的作用: 當錯誤發生時, 用一個數據流代替當前數據流, 繼續發送數據; 和上面一樣,Subscribe的onError方法不會被調用

onErrorResumeNext.png
onExceptionResumeNext

onExceptionResumeNext類似, 唯一的區別就是onExceptionResumeNext捕獲的是異常

如果拋出的Throwable不是一個Exception, 該操作符無法捕獲

Retry

如果發生了異常, 也可以使用retry重新訂閱; 使用retry重新訂閱數據流后, Observable會從頭重新發射數據, 意味著可能會重復處理數據

retry.png

retry有三個重載方法

  • retry 無限重新訂閱
  • retry(long) 帶有最大重試次數, 次數超過,則不再重試
  • retry(Func) 帶有一個判讀函數, 如果返回true, 則重試; 返回false,則結束
retryWhen

retryWhenretry類似, 不過接受一個函數, 該函數返回一個Observable, 由Observable發射的數據, 決定是否需要重新訂閱

  • 如果返回的Observable發射一個數據, 則重新訂閱
  • 如果返回的Observable發射一個錯誤, 則不會重試

返回的Observable發射的數據類型不重要; Observable只是用來判斷是否需要重試

不結束當前數據流, 捕獲(處理,忽略)異常

在平常編碼中, 處理一序列的數據, 通常對其中的一個數據處理異常時, 我們通常會捕獲忽略異常, 跳過該數據, 繼續處理剩下的數據;

上述的操作符中, 上面的操作符并不能實現該功能; onErrorReturn遇到異常時,會結束該數據留, 不會處理剩下的數據; 而retry會從頭重新發射數據, 有重復數據;
這種情況需要和flatMap一起搭配使用; flatMap可以把每項數據轉換成為一個Observable, 然后就可以針對每個數據處理異常了

Random random = new Random();
Observable<Integer> observable =
        Observable.create(o -> {
            o.onNext(random.nextInt());
            o.onNext(random.nextInt());
            o.onError(new Exception());
            o.onNext(random.nextInt());
        }).flatMap(o -> Observable.just(o)
                .map(Object::toString)
                .map(Integer::valueOf)
                .onErrorReturn(throwable -> -1)
        );
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 本篇文章介主要紹RxJava中操作符是以函數作為基本單位,與響應式編程作為結合使用的,對什么是操作、操作符都有哪些...
    嘎啦果安卓獸閱讀 2,893評論 0 10
  • 作者: maplejaw本篇只解析標準包中的操作符。對于擴展包,由于使用率較低,如有需求,請讀者自行查閱文檔。 創...
    maplejaw_閱讀 45,839評論 8 93
  • 注:只包含標準包中的操作符,用于個人學習及備忘參考博客:http://blog.csdn.net/maplejaw...
    小白要超神閱讀 971評論 0 3
  • 創建操作 用于創建Observable的操作符Create通過調用觀察者的方法從頭創建一個ObservableEm...
    rkua閱讀 1,872評論 0 1
  • 參考:給 Android 開發者的 RxJava 詳解-扔物線深入淺出RxJava 基礎 "a library f...
    Vincen1024閱讀 548評論 0 1