Rxjava異常操作符

Rxjava操作符索引

這篇章主要介紹Rxjava的異常操作符

目錄

Catch

onErrorReturnItem

onErrorReturn

onErrorResumeWith

onErrorResumeNext

Retry

retry

retryUntil


Catch

主要攔截原始Observable的onError通知,替換成爲其他數據項或數據列。

onErrorReturnItem

讓observable遇到錯誤時發射一個指定數據項並正常終止

Observable observable = Observable.create(observableEmitter -> {
            for (int i = 0; i < 5; i++){
                if (i == 2){
                    observableEmitter.onError(new Exception("異常測試"));
                }else{
                    observableEmitter.onNext(i+"");
                }
            }
            observableEmitter.onComplete();
        });
observable.onErrorReturnItem(-1).subscribe(num -> System.out.println(num+"*"));

結果:

0*
1*
-1*

看到代碼就明白了,我設置發射數據等於2的時候報異常,然後異常的時候就打印了-1

onErrorReturn

這個跟上面的區別的是,它可以捕捉到異常,那你就可以根據異常來決定返回那個數據源

observable.onErrorReturn(new Function<Throwable, Integer>() {
            @Override
            public Integer apply(Throwable throwable) throws Throwable {
                System.out.println(throwable.getMessage());
                return -1;
            }
        }).subscribe(num -> System.out.println(num+"*"));

結果:

0*
1*
異常測試
-1*

這裏的observable跟上面一樣,只是換了個catch操作符的操作。

onErrorResumeWith

這個操作符,當異常的時候,切換髮射第二個observable的數據列

observable.onErrorResumeWith(Observable.just(-1,-2,-3)).subscribe(num -> System.out.println(num+"*"));

結果:

0*
1*
-1*
-2*
-3*

一樣是上面的observable,遇到2的時候異常,然後就發射第二個設置的observable了

onErrorResumeNext

這個就不寫代碼了,它其實跟上面的onErrorResumeWith一樣遇到異常發射第二個observable,不過它跟onErrorReturn一樣可以拿到異常,那就可以根據異常決定設置哪個observable

 

Retry

當observable遇到異常時,就行重新訂閱

retry

// 不加參數就是無限地retry
        observable.retry(2).subscribe(num -> System.out.println(num+"*")
                , throwable -> System.out.println("異常測試"));

結果:

0*
1*
0*
1*
0*
1*
異常測試

observable還是上面catch操作符裏面的例子那個。retry裏面填了參數2,表明會重新訂閱兩次,還是異常就輸出異常。如果不填參數,就會不斷retry,直到不異常爲止

retryUntil

簡單一句就是有條件的retry

observable.retryUntil(new BooleanSupplier() {
            @Override
            public boolean getAsBoolean() throws Throwable {
                // true就表示不retry了,進入異常
                // false就表示繼續retry
                return true;
            }
        }).subscribe(num -> System.out.println(num+"*")
                , throwable -> System.out.println("異常測試"));

結果:

0*
1*
異常測試

如代碼所示,當函數裏面返回true就不retry了,false就繼續retry

發佈了21 篇原創文章 · 獲贊 14 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章