RxJava的錯誤處理一-retry

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秒以后。

參考

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 0. 概述 感謝:對RxJava中.repeatWhen()和.retryWhen()操作符的思考[http://...
    CokeNello閱讀 734評論 3 1
  • 我從去年開始使用 RxJava ,到現在一年多了。今年加入了 Flipboard 后,看到 Flipboard 的...
    Jason_andy閱讀 5,570評論 7 62
  • 文章轉自:http://gank.io/post/560e15be2dca930e00da1083作者:扔物線在正...
    xpengb閱讀 7,061評論 9 73
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • 早上睜開眼睛,看見手機屏幕上一條短信,“你的套餐語音通話時長已用完,流量剩余2.89G,請補充交費”,我去,腦殘的...
    憂郁的老虎閱讀 879評論 3 7