1.onErrorReturn
- 作用
遇到错误时,发送1个特殊事件 & 正常终止
Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> e) throws Exception { e.onNext(1); e.onNext(2); e.onError(new Throwable("发生错误了")); } }).onErrorReturn(new Function<Throwable, Integer>() { @Override public Integer apply(Throwable throwable) throws Exception { LogUtils.syso("=====在onErrorReturn处理了错误:============"+throwable.getMessage()); return 666; } }).subscribe(new Observer<Integer>() { @Override public void onSubscribe(Disposable d) { LogUtils.syso("=====onSubscribe============"); } @Override public void onNext(Integer integer) { LogUtils.syso("=======onNext=========="+integer); } @Override public void onError(Throwable e) { LogUtils.syso("=======onError=========="); } @Override public void onComplete() { LogUtils.syso("=======onComplete=========="); } });
2.onErrorResumeNext
- 作用
遇到错误时,发送1个新的Observable
注:
onErrorResumeNext()
拦截的错误 =Throwable
;若需拦截Exception
请用onExceptionResumeNext()
- 若
onErrorResumeNext()
拦截的错误 =Exception
,则会将错误传递给观察者的onError
方法
Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> e) throws Exception { e.onNext(1); e.onNext(2); e.onError(new Throwable("发生错误了")); } }).onErrorResumeNext(new Function<Throwable, ObservableSource<? extends Integer>>() { @Override public ObservableSource<? extends Integer> apply(Throwable throwable) throws Exception { LogUtils.syso("=====onErrorResumeNext============"+throwable.getMessage()); return Observable.just(5,6); } }).subscribe(new Observer<Integer>() { @Override public void onSubscribe(Disposable d) { LogUtils.syso("=====onSubscribe============"); } @Override public void onNext(Integer integer) { LogUtils.syso("=======onNext=========="+integer); } @Override public void onError(Throwable e) { LogUtils.syso("=======onError=========="); } @Override public void onComplete() { LogUtils.syso("=======onComplete=========="); } });
3. onExceptionResumeNext
Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> e) throws Exception { e.onNext(1); e.onNext(2); e.onError(new NullPointerException()); } }).onExceptionResumeNext(new Observable<Integer>() { @Override protected void subscribeActual(Observer<? super Integer> observer) { LogUtils.syso("=====onExceptionResumeNext============"); observer.onNext(10); observer.onNext(11); observer.onComplete(); } }).subscribe(new Observer<Integer>() { @Override public void onSubscribe(Disposable d) { LogUtils.syso("=====onSubscribe============"); } @Override public void onNext(Integer integer) { LogUtils.syso("=======onNext=========="+integer); } @Override public void onError(Throwable e) { LogUtils.syso("=======onError=========="+e.getMessage()); } @Override public void onComplete() { LogUtils.syso("=======onComplete=========="); } });
4.retry
- 作用
重试,即当出现错误时,让被观察者(Observable
)重新发射数据
- 接收到 onError()时,重新订阅 & 发送事件
Throwable
和Exception
都可拦截
Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> e) throws Exception { e.onNext(1); e.onNext(2); e.onError(new NullPointerException()); } }) //若一直错误,则一直重新发送 .retry() .subscribe(new Observer<Integer>() { @Override public void onSubscribe(Disposable d) { LogUtils.syso("=====onSubscribe============"); } @Override public void onNext(Integer integer) { LogUtils.syso("=======onNext=========="+integer); } @Override public void onError(Throwable e) { LogUtils.syso("=======onError=========="+e.getMessage()); } @Override public void onComplete() { LogUtils.syso("=======onComplete=========="); } });
Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> e) throws Exception { e.onNext(1); e.onNext(2); e.onError(new Throwable("出现错误")); } }) //重试次数 .retry(3) .subscribe(new Observer<Integer>() { @Override public void onSubscribe(Disposable d) { LogUtils.syso("=====onSubscribe============"); } @Override public void onNext(Integer integer) { LogUtils.syso("=======onNext=========="+integer); } @Override public void onError(Throwable e) { LogUtils.syso("=======onError=========="+e.getMessage()); } @Override public void onComplete() { LogUtils.syso("=======onComplete=========="); } });
Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> e) throws Exception { e.onNext(1); e.onNext(2); e.onError(new Throwable("出现错误")); } }) // 作用:出现错误后,判断是否需要重新发送数据(若需要重新发送& 持续遇到错误,则持续重试) // 参数 = 判断逻辑 .retry(new Predicate<Throwable>() { @Override public boolean test(Throwable throwable) throws Exception { //返回false = 不重新重新发送数据 & 调用观察者的onError结束 //返回true = 重新发送请求(若持续遇到错误,就持续重新发送) return true; } }) .subscribe(new Observer<Integer>() { @Override public void onSubscribe(Disposable d) { LogUtils.syso("=====onSubscribe============"); } @Override public void onNext(Integer integer) { LogUtils.syso("=======onNext=========="+integer); } @Override public void onError(Throwable e) { LogUtils.syso("=======onError=========="+e.getMessage()); } @Override public void onComplete() { LogUtils.syso("=======onComplete=========="); } });
// 5. retry(long time,Predicate predicate) // 作用:出现错误后,判断是否需要重新发送数据(具备重试次数限制 // 参数 = 设置重试次数 & 判断逻辑 Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> e) throws Exception { e.onNext(1); e.onNext(2); e.onError(new Throwable("出现错误")); } }) // 拦截错误后,判断是否需要重新发送请求 .retry(2,new Predicate<Throwable>() { @Override public boolean test(Throwable throwable) throws Exception { // 捕获异常 LogUtils.syso("=====retry错误============"+throwable.toString()); //返回false = 不重新重新发送数据 & 调用观察者的onError()结束 //返回true = 重新发送请求(最多重新发送3次) return true; } }) .subscribe(new Observer<Integer>() { @Override public void onSubscribe(Disposable d) { LogUtils.syso("=====onSubscribe============"); } @Override public void onNext(Integer integer) { LogUtils.syso("=======onNext=========="+integer); } @Override public void onError(Throwable e) { LogUtils.syso("=======onError=========="+e.getMessage()); } @Override public void onComplete() { LogUtils.syso("=======onComplete=========="); } });
// 5. retry(long time,Predicate predicate) // 作用:出现错误后,判断是否需要重新发送数据(具备重试次数限制 // 参数 = 设置重试次数 & 判断逻辑 Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> e) throws Exception { e.onNext(1); e.onNext(2); e.onError(new Throwable("出现错误")); } }) .retry(new BiPredicate<Integer, Throwable>() { @Override public boolean test(Integer integer, Throwable throwable) throws Exception { // 捕获异常 LogUtils.syso("=====异常错误============"+throwable.toString()); // 获取当前重试次数 LogUtils.syso("=====当前重试次数============"+integer); //返回false = 不重新重新发送数据 & 调用观察者的onError结束 //返回true = 重新发送请求(若持续遇到错误,就持续重新发送) return true; } }) .subscribe(new Observer<Integer>() { @Override public void onSubscribe(Disposable d) { LogUtils.syso("=====onSubscribe============"); } @Override public void onNext(Integer integer) { LogUtils.syso("=======onNext=========="+integer); } @Override public void onError(Throwable e) { LogUtils.syso("=======onError=========="+e.getMessage()); } @Override public void onComplete() { LogUtils.syso("=======onComplete=========="); } });
retryUntil
- 作用
出现错误后,判断是否需要重新发送数据
- 若需要重新发送 & 持续遇到错误,则持续重试
- 作用类似于
retry(Predicate predicate)
- 具体使用
具体使用类似于retry(Predicate predicate)
,唯一区别:返回true
则不重新发送数据事件
Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> e) throws Exception { e.onNext(1); e.onNext(2); e.onError(new Throwable("出现错误")); } }) //具体使用类似于retry(Predicate predicate),唯一区别:返回 true 则不重新发送数据事件 .retryUntil(new BooleanSupplier() { @Override public boolean getAsBoolean() throws Exception { return true; } }) .subscribe(new Observer<Integer>() { @Override public void onSubscribe(Disposable d) { LogUtils.syso("=====onSubscribe============"); } @Override public void onNext(Integer integer) { LogUtils.syso("=======onNext=========="+integer); } @Override public void onError(Throwable e) { LogUtils.syso("=======onError=========="+e.getMessage()); } @Override public void onComplete() { LogUtils.syso("=======onComplete=========="); } });
retrywhen
- 作用
遇到错误时,将发生的错误传递给一个新的被观察者(Observable
),并决定是否需要重新订阅原始被观察者(Observable
)& 发送事件
Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> e) throws Exception { e.onNext(1); e.onNext(2); e.onError(new Throwable("出现错误")); e.onNext(3); } }) .retryWhen(new Function<Observable<Throwable>, ObservableSource<?>>() { @Override public ObservableSource<?> apply(Observable<Throwable> throwableObservable) throws Exception { return throwableObservable.flatMap(new Function<Throwable, ObservableSource<?>>() { @Override public ObservableSource<?> apply(Throwable throwable) throws Exception { return Observable.error(new Throwable("retryWhen终止啦")); } }); } }) .subscribe(new Observer<Integer>() { @Override public void onSubscribe(Disposable d) { LogUtils.syso("=====onSubscribe============"); } @Override public void onNext(Integer integer) { LogUtils.syso("=======onNext=========="+integer); } @Override public void onError(Throwable e) { LogUtils.syso("=======onError=========="+e.getMessage()); } @Override public void onComplete() { LogUtils.syso("=======onComplete=========="); } });
source.retryWhen(new Func1<Observable<? extends Throwable>, Observable<?>>() {
@Override
public Observable<?> call(Observable<? extends Throwable> observable) {
return observable.flatMap(new Func1<Throwable, Observable<?>>() {
@Override
public Observable<?> call(Throwable throwable) {
......//在这处我们可以针对不同的异常做一些处理,比如中断重试
return Observable.error(throwable);
}
});
}
});