RxJava的錯(cuò)誤處理主要分為兩類,retry系列以及onErrorRetrun系列瞬哼。retry系列是當(dāng)錯(cuò)誤的時(shí)候哟旗,重新subscribe。onErrorReturn系列則是當(dāng)出錯(cuò)了返回?cái)?shù)據(jù)到onNext中芥驳。本文介紹下retry系列相關(guān)用法。
retry
retry
系列的操作符主要有retry()
, retry(long)
和retry(Func2)
茬高,retry(n)
當(dāng)發(fā)生onError的時(shí)候會(huì)重試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
加一怎栽,重試次數(shù)為2次丽猬,所以最終相當(dāng)于onSubscribe
執(zhí)行了3次。
retryWhen
另外一個(gè)方法retryWhen
的方法是根據(jù)得到的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
的屬性脚祟,這里用一個(gè)AtomicInteger,設(shè)置最大重試次數(shù)為3强饮,每次減1由桌,當(dāng)?shù)扔?則不再重試,再現(xiàn)實(shí)生活中邮丰,也可以判斷Exception
的類型等方式判斷是否需要重試行您。接著用flatMap
返回Observerable.timer
來延遲重試到1秒以后。