鍍金池/ 教程/ Android/ Retry
調度器 Scheduler
Empty/Never/Throw
Replay
這個頁面展示了創(chuàng)建Observable的各種方法。
ObserveOn
ReactiveX
TimeInterval
Window
本頁展示的操作符用于對整個序列執(zhí)行算法操作或其它操作,由于這些操作必須等待數(shù)據(jù)發(fā)射完成(通常也必須緩存這些數(shù)據(jù)),它們對于非常長
IgnoreElements
Distinct
Last
Start
And/Then/When
Switch
創(chuàng)建操作
Materialize/Dematerialize
CombineLatest
Catch
實現(xiàn)自己的操作符
StringObservable
Map
ConnectableObservable
Using
Take
BlockingObservable
TakeLast
Defer
RxJavaSchedulersHook
First
FlatMap
這個頁面的操作符可用于根據(jù)條件發(fā)射或變換Observables,或者對它們做布爾運算:
Do
Repeat
Serialize
這個頁面展示的操作符可用于過濾和選擇Observable發(fā)射的數(shù)據(jù)序列。
這個頁面列出了很多用于Observable的輔助操作符
Single
Retry
從錯誤中恢復的技術
Sample
Merge
算術和聚合操作
Range
Timestamp
RxJava Issues
From
Subscribe
Subject
Delay
Skip
SubscribeOn
Filter
按字母順序排列的全部操作符列表
Timeout
Scan
onError
Zip
RxJava文檔和教程
Publish
ElementAt
第一個例子
SkipLast
Just
Timer
Debounce
GroupBy
條件和布爾操作
這個頁面展示了可用于對Observable發(fā)射的數(shù)據(jù)執(zhí)行變換操作的各種操作符。
Introduction
rxjava-async
介紹響應式編程
這個頁面展示的操作符可用于組合多個Observables。
ReactiveX
Connect
操作符分類
StartWith
Interval
Join
To
Buffer
RefCount
介紹
Observable

Retry

Retry

如果原始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)為retryretryWhen。

無論收到多少次onError通知,無參數(shù)版本的retry都會繼續(xù)訂閱并發(fā)射原始Observable。

接受單個count參數(shù)的retry會最多重新訂閱指定的次數(shù),如果次數(shù)超了,它不會嘗試再次訂閱,它會把最新的一個onError通知傳遞給它的觀察者。

還有一個版本的retry接受一個謂詞函數(shù)作為參數(shù),這個函數(shù)的兩個參數(shù)是:重試次數(shù)和導致發(fā)射onError通知的Throwable。這個函數(shù)返回一個布爾值,如果返回trueretry應該再次訂閱和鏡像原始的Observable,如果返回false,retry會將最新的一個onError通知傳遞給它的觀察者。

retry操作符默認在trampoline調度器上執(zhí)行。

retryWhen

http://wiki.jikexueyuan.com/project/rx-docs/images/operators/retryWhen.f.png" alt="retryWhen" />

retryWhenretry類似,區(qū)別是,retryWhenonError中的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
上一篇:Delay下一篇:介紹