RxJava 错误处理

Rx中, 很容易处理异常, 整个链式调用过程中,如果异常不做处理, 最后都会交给onError;

不要过渡的依赖onError; onError应该是在数据实在是无法处理的情况下,才被调用; 因为onError一旦被调用, 即意味着整个事件流结束;

在传统的Java中, 一般产生异常, 可以自己决定处理或者抛出, 在Rx中也类似, 可以自己决定在产生异常后, 如何处理;

Catch

和传统Java中Catch类似, 获取异常,然后自行决定如何处理;

onErrorReturn

onErrorReturn操作符作用: 当发生错误是, 发送一个默认值,然后结束数据流(即调用onComplete); 使用后,Subscribe的onError方法不会被调用,会正常的调用onComplete结束;

onErrorReturn.png
onErrorResumeNext

onErrorResumeNext操作符的作用: 当错误发生时, 用一个数据流代替当前数据流, 继续发送数据; 和上面一样,Subscribe的onError方法不会被调用

onErrorResumeNext.png
onExceptionResumeNext

onExceptionResumeNext类似, 唯一的区别就是onExceptionResumeNext捕获的是异常

如果抛出的Throwable不是一个Exception, 该操作符无法捕获

Retry

如果发生了异常, 也可以使用retry重新订阅; 使用retry重新订阅数据流后, Observable会从头重新发射数据, 意味着可能会重复处理数据

retry.png

retry有三个重载方法

  • retry 无限重新订阅
  • retry(long) 带有最大重试次数, 次数超过,则不再重试
  • retry(Func) 带有一个判读函数, 如果返回true, 则重试; 返回false,则结束
retryWhen

retryWhenretry类似, 不过接受一个函数, 该函数返回一个Observable, 由Observable发射的数据, 决定是否需要重新订阅

  • 如果返回的Observable发射一个数据, 则重新订阅
  • 如果返回的Observable发射一个错误, 则不会重试

返回的Observable发射的数据类型不重要; Observable只是用来判断是否需要重试

不结束当前数据流, 捕获(处理,忽略)异常

在平常编码中, 处理一序列的数据, 通常对其中的一个数据处理异常时, 我们通常会捕获忽略异常, 跳过该数据, 继续处理剩下的数据;

上述的操作符中, 上面的操作符并不能实现该功能; onErrorReturn遇到异常时,会结束该数据留, 不会处理剩下的数据; 而retry会从头重新发射数据, 有重复数据;
这种情况需要和flatMap一起搭配使用; flatMap可以把每项数据转换成为一个Observable, 然后就可以针对每个数据处理异常了

Random random = new Random();
Observable<Integer> observable =
        Observable.create(o -> {
            o.onNext(random.nextInt());
            o.onNext(random.nextInt());
            o.onError(new Exception());
            o.onNext(random.nextInt());
        }).flatMap(o -> Observable.just(o)
                .map(Object::toString)
                .map(Integer::valueOf)
                .onErrorReturn(throwable -> -1)
        );
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本篇文章介主要绍RxJava中操作符是以函数作为基本单位,与响应式编程作为结合使用的,对什么是操作、操作符都有哪些...
    嘎啦果安卓兽阅读 2,890评论 0 10
  • 作者: maplejaw本篇只解析标准包中的操作符。对于扩展包,由于使用率较低,如有需求,请读者自行查阅文档。 创...
    maplejaw_阅读 45,804评论 8 93
  • 注:只包含标准包中的操作符,用于个人学习及备忘参考博客:http://blog.csdn.net/maplejaw...
    小白要超神阅读 959评论 0 3
  • 创建操作 用于创建Observable的操作符Create通过调用观察者的方法从头创建一个ObservableEm...
    rkua阅读 1,863评论 0 1
  • 参考:给 Android 开发者的 RxJava 详解-扔物线深入浅出RxJava 基础 "a library f...
    Vincen1024阅读 548评论 0 1