這篇章主要介紹Rxjava的異常操作符
目錄
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