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<?>>() {@Overridepublic Observable<?> call(Observable<? extends Throwable> observable) {return observable.flatMap(new Func1<Throwable, Observable<?>>() {@Overridepublic Observable<?> call(Throwable throwable) {......//在这处我们可以针对不同的异常做一些处理,比如中断重试return Observable.error(throwable);}});}});
本文详细介绍了RxJava中处理错误的各种方法,包括onErrorReturn、onErrorResumeNext、onExceptionResumeNext等操作符的使用场景及区别,并展示了如何通过retry系列操作符实现错误重试。
9426

被折叠的 条评论
为什么被折叠?



