如果原始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ì)無(wú)錯(cuò)誤地完成它的數(shù)據(jù)序列。Retry總是傳遞onNext通知給觀察者,由于重新訂閱,可能會(huì)造成數(shù)據(jù)項(xiàng)重復(fù),如上圖所示。
RxJava中的實(shí)現(xiàn)為retry和retryWhen。
無(wú)論收到多少次onError通知,無(wú)參數(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