如果原始Observable遇到錯誤,重新訂閱它期望它能正常終止
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/retry.C.png" alt="retry" />
Retry
操作符不會將原始Observable的onError
通知傳遞給觀察者,它會訂閱這個Observable,再給它一次機會無錯誤地完成它的數(shù)據(jù)序列。Retry
總是傳遞onNext
通知給觀察者,由于重新訂閱,可能會造成數(shù)據(jù)項重復,如上圖所示。
RxJava中的實現(xiàn)為retry
和retryWhen
。
無論收到多少次onError
通知,無參數(shù)版本的retry
都會繼續(xù)訂閱并發(fā)射原始Observable。
接受單個count
參數(shù)的retry
會最多重新訂閱指定的次數(shù),如果次數(shù)超了,它不會嘗試再次訂閱,它會把最新的一個onError
通知傳遞給它的觀察者。
還有一個版本的retry
接受一個謂詞函數(shù)作為參數(shù),這個函數(shù)的兩個參數(shù)是:重試次數(shù)和導致發(fā)射onError
通知的Throwable
。這個函數(shù)返回一個布爾值,如果返回true
,retry
應該再次訂閱和鏡像原始的Observable,如果返回false
,retry
會將最新的一個onError
通知傳遞給它的觀察者。
retry
操作符默認在trampoline
調度器上執(zhí)行。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/retryWhen.f.png" alt="retryWhen" />
retryWhen
和retry
類似,區(qū)別是,retryWhen
將onError
中的Throwable
傳遞給一個函數(shù),這個函數(shù)產生另一個Observable,retryWhen
觀察它的結果再決定是不是要重新訂閱原始的Observable。如果這個Observable發(fā)射了一項數(shù)據(jù),它就重新訂閱,如果這個Observable發(fā)射的是onError
通知,它就將這個通知傳遞給觀察者然后終止。
retryWhen
默認在trampoline
調度器上執(zhí)行,你可以通過參數(shù)指定其它的調度器。
示例代碼
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