Rxjava2(五)错误处理

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

注:

  1. onErrorResumeNext()拦截的错误 = Throwable;若需拦截Exception请用onExceptionResumeNext()
  2. 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)重新发射数据
  1. 接收到 onError()时,重新订阅 & 发送事件
  2. 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. retrylong 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. retrylong 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

  • 作用
    出现错误后,判断是否需要重新发送数据
  1. 若需要重新发送 & 持续遇到错误,则持续重试
  2. 作用类似于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("出现错误"));
    }
})
        //具体使用类似于retryPredicate 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)& 发送事件
retryWhen 是在抛出异常的情况下调用的,上面的代码也告诉了我们,在 retryWhen 里面是将 throwable 传进去了了。那应该怎么取这个异常呢?我们可以通过 flatmap 做个转换。

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==========");
    }
});

  1. source.retryWhen(new Func1<Observable<? extends Throwable>, Observable<?>>() {
  2. @Override
  3. public Observable<?> call(Observable<? extends Throwable> observable) {
  4. return observable.flatMap(new Func1<Throwable, Observable<?>>() {
  5. @Override
  6. public Observable<?> call(Throwable throwable) {
  7. ......//在这处我们可以针对不同的异常做一些处理,比如中断重试
  8. return Observable.error(throwable);
  9. }
  10. });
  11. }
  12. });

猜你喜欢

转载自blog.csdn.net/oneblue123/article/details/80590953