如果原始Observable遇到錯(cuò)誤,重新訂閱它期望它能正常終止
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/retry.C.png" alt="retry" />
Retry
操作符不會(huì)將原始Observable的onError
通知傳遞給觀察者,它會(huì)訂閱這個(gè)Observable,再給它一次機(jī)會(huì)無錯(cuò)誤地完成它的數(shù)據(jù)序列。Retry
總是傳遞onNext
通知給觀察者,由于重新訂閱,可能會(huì)造成數(shù)據(jù)項(xiàng)重復(fù),如上圖所示。
RxJava中的實(shí)現(xiàn)為retry
和retryWhen
。
無論收到多少次onError
通知,無參數(shù)版本的retry
都會(huì)繼續(xù)訂閱并發(fā)射原始Observable。
接受單個(gè)count
參數(shù)的retry
會(huì)最多重新訂閱指定的次數(shù),如果次數(shù)超了,它不會(huì)嘗試再次訂閱,它會(huì)把最新的一個(gè)onError
通知傳遞給它的觀察者。
還有一個(gè)版本的retry
接受一個(gè)謂詞函數(shù)作為參數(shù),這個(gè)函數(shù)的兩個(gè)參數(shù)是:重試次數(shù)和導(dǎo)致發(fā)射onError
通知的Throwable
。這個(gè)函數(shù)返回一個(gè)布爾值,如果返回true
,retry
應(yīng)該再次訂閱和鏡像原始的Observable,如果返回false
,retry
會(huì)將最新的一個(gè)onError
通知傳遞給它的觀察者。
retry
操作符默認(rèn)在trampoline
調(diào)度器上執(zhí)行。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/retryWhen.f.png" alt="retryWhen" />
retryWhen
和retry
類似,區(qū)別是,retryWhen
將onError
中的Throwable
傳遞給一個(gè)函數(shù),這個(gè)函數(shù)產(chǎn)生另一個(gè)Observable,retryWhen
觀察它的結(jié)果再?zèng)Q定是不是要重新訂閱原始的Observable。如果這個(gè)Observable發(fā)射了一項(xiàng)數(shù)據(jù),它就重新訂閱,如果這個(gè)Observable發(fā)射的是onError
通知,它就將這個(gè)通知傳遞給觀察者然后終止。
retryWhen
默認(rèn)在trampoline
調(diào)度器上執(zhí)行,你可以通過參數(shù)指定其它的調(diào)度器。
示例代碼
Observable.create((Subscriber<? super String> s) -> {
System.out.println("subscribing");
s.onError(new RuntimeException("always fails"));
}).retryWhen(attempts -> {
return attempts.zipWith(Observable.range(1, 3), (n, i) -> i).flatMap(i -> {
System.out.println("delay retry by " + i + " second(s)");
return Observable.timer(i, TimeUnit.SECONDS);
});
}).toBlocking().forEach(System.out::println);
輸出
subscribing
delay retry by 1 second(s)
subscribing
delay retry by 2 second(s)
subscribing
delay retry by 3 second(s)
subscribing