美文网首页
RxJava的错误处理一-retry

RxJava的错误处理一-retry

作者: Juude | 来源:发表于2017-10-25 16:06 被阅读712次

RxJava的错误处理主要分为两类,retry系列以及onErrorRetrun系列。retry系列是当错误的时候,重新subscribe。onErrorReturn系列则是当出错了返回数据到onNext中。本文介绍下retry系列相关用法。

retry

retry系列的操作符主要有retry()
, retry(long)
retry(Func2)
retry(n)当发生onError的时候会重试n次,例如如下代码:

@Test
public void testRetry() {
    final AtomicInteger atomicInteger = new AtomicInteger(0);
    Observable.create(new Observable.OnSubscribe<String>() {
        @Override
        public void call(Subscriber<? super String> subscriber) {
            subscriber.onNext(String.valueOf(System.currentTimeMillis()));
            subscriber.onError(new Error("error"));
        }
    })
    .doOnSubscribe(new Action0() {
        @Override
        public void call() {
            atomicInteger.incrementAndGet();
        }
    })
    .retry(2)
    .toBlocking()
    .subscribe(new TestSubscriber<String>());
    Assert.assertTrue(atomicInteger.intValue() == 3);
}

初始化atomicInteger为0,在doOnSubscribe加一,重试次数为2次,所以最终相当于onSubscribe执行了3次。

retryWhen

另外一个方法retryWhen的方法是根据得到的Throwable生成新的Observerable, 示例代码如下:

@Test
public void testRetryWhen() {
    final AtomicInteger atomicInteger = new AtomicInteger(3);
    Observable.create(new Observable.OnSubscribe<String>() {
        @Override
        public void call(Subscriber<? super String> subscriber) {
            subscriber.onNext(String.valueOf(System.currentTimeMillis()));
            subscriber.onError(new Error(String.valueOf(atomicInteger.decrementAndGet())));
        }
    })
    .retryWhen(new Func1<Observable<? extends Throwable>, Observable<?>>() {
        @Override
        public Observable<?> call(Observable<? extends Throwable> observable) {
            return observable.takeWhile(new Func1<Throwable, Boolean>() {
                @Override
                public Boolean call(Throwable throwable) {
                    return Integer.parseInt(throwable.getMessage()) > 0;
                }
            })
            .flatMap(new Func1<Throwable, Observable<?>>() {
                @Override
                public Observable<?> call(Throwable throwable) {
                    return Observable.timer(1, TimeUnit.SECONDS);
                }
            });
        }
    })
    .toBlocking()
    .subscribe(new TestSubscriber<String>());
    Assert.assertEquals(atomicInteger.intValue(), 0);
}

这里接受到throwableObserverable后,用takeWhile来判断thrwoable的属性,这里用一个AtomicInteger,设置最大重试次数为3,每次减1,当等于0则不再重试,再现实生活中,也可以判断Exception的类型等方式判断是否需要重试。接着用flatMap返回Observerable.timer来延迟重试到1秒以后。

参考

相关文章

  • RxJava的错误处理一-retry

    RxJava的错误处理主要分为两类,retry系列以及onErrorRetrun系列。retry系列是当错误的时候...

  • RxJava(七)--错误处理操作符

    错误处理操作符 catch、retry 实例与功能介绍 1. catch操作符 代码实例 结果 功能:catch操...

  • Error Handling

    一旦序列里面产出了一个 error 事件,整个序列将被终止。RxSwift 主要有两种错误处理机制: retry ...

  • RxJava基础五-错误处理操作符

    此篇内容均是来自书籍《RxJava响应式编程》李衍顺 著 3.5 错误处理操作符 RxJava对错误的处理很方便,...

  • Rxjava错误处理

    在RxJava中错误处理的最佳方式是什么? 原文地址:https://rongi.github.io/kotlin...

  • RxJava 错误处理

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

  • RxJava错误处理与线程并发

    错误处理 Rxjava为链式调用,事件从源头流到尽头。一个源头链条中发生异常或者Observable.error(...

  • RxJava学习(六)retry,retryWhen,repea

    1.retry当出现错误事件,即当被观察者发送错误事件时。被观察者重新订阅并发送事件。并且是无条件重新订阅。 2....

  • 重试

    Spring Retry Guava Retry

  • RxJava中的错误处理

    在RxJava中我们可以很方便地处理异常,只要加上 onError 即可。 不过,如果异常发生在操作符内部,比如 ...

网友评论

      本文标题:RxJava的错误处理一-retry

      本文链接:https://www.haomeiwen.com/subject/cgwkettx.html