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);
}
這里接受到throwable
的Observerable
后,用takeWhile
來判斷thrwoable
的屬性,這里用一個AtomicInteger,設置最大重試次數為3,每次減1,當等于0則不再重試,再現實生活中,也可以判斷Exception
的類型等方式判斷是否需要重試。接著用flatMap
返回Observerable.timer
來延遲重試到1秒以后。