Rxjava異常型操作符
onErrorReturn
當發射onError事件的時候,就會攔截這個事件
onErrorResumeNext
跟onErrorReturn 差不多,只是onErrorResumeNext 返回的是一個被觀察者,可以自己發射事件
onExceptionResumeNext
可以防止應用異常崩潰
retry
重試操作符,就是當上遊發射了onError的時候,就會走到重試操作符裏
onErrorReturn
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> e) throws Exception {
for (int i = 0; i < 100; i++) {
if (i == 5) {
e.onError(new IllegalArgumentException("異常了..."));
} else {
e.onNext(i);
}
}
e.onComplete();
}
}).onErrorReturn(new Function<Throwable, Integer>() {
@Override
public Integer apply(Throwable throwable) throws Exception {
Log.e(TAG, "onErrorReturn" + throwable.getMessage());
return 404;
}
}).subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Integer integer) {
Log.e(TAG, "onNext: " + integer);
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError");
}
@Override
public void onComplete() {
Log.e(TAG, "onComplete");
}
});
就像上面代碼,前面先會輸出
onNext: 1
onNext: 2
onNext: 3
onNext: 4
當i==5的時候發送了一個onError事件,這個時候就會被onErrorReturn異常操作符給攔截輸出
onErrorReturn異常了...
然後在他的apply方法裏就會自動發射出一個onNext事件給下游接收,就會輸出
onNext: 400 最後就是輸出
onComplete
在這過程中不會輸出onError下游事件
如果發射事件的時候直接異常了這個時候 程序會崩潰,
如果沒有異常操作符的話,就會直接走到下游的onError
onExceptionResumeNext
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> e) throws Exception {
for (int i = 0; i < 100; i++) {
if (i == 5) {
throw new Exception("解析數據出錯");
} else {
e.onNext(i);
}
}
e.onComplete();
}
})
.onExceptionResumeNext(new ObservableSource<Integer>() {
@Override
public void subscribe(Observer<? super Integer> observer) {
Log.e(TAG, "onExceptionResumeNext");
observer.onNext(400);
}
})
.subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Integer integer) {
Log.e(TAG, "onNext" + integer);
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError" );
}
@Override
public void onComplete() {
Log.e(TAG, "onComplete" );
}
});
當在上游直接throw new Exception("解析數據出錯");的時候,應用不會直接閃退,會直接到到異常操作符事件那.
retry
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> e) throws Exception {
for (int i = 0; i < 100; i++) {
if (i == 5) {
throw new Exception("解析數據出錯");
} else {
e.onNext(i);
}
}
e.onComplete();
}
})
.retry(new Predicate<Throwable>() {
@Override
public boolean test(Throwable throwable) throws Exception {
Log.e(TAG, "retry: "+ throwable.getMessage());
return false;//如果返回false則不重試
}
})
.subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Integer integer) {
Log.e(TAG, "onNext" + integer);
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError");
}
@Override
public void onComplete() {
Log.e(TAG, "onComplete");
}
});
他還有幾個API
.retry(4, new Predicate<Throwable>() {//代表會 重試4次
@Override
public boolean test(Throwable throwable) throws Exception {
return true;
}
})
.retry(new BiPredicate<Integer, Throwable>() {
@Override
public boolean test(Integer integer, Throwable throwable) throws Exception {
return true;//integer現在重試的是多少次 }
})