## Retry
如果原始Observable遇到錯誤,重新訂閱它期望它能正常終止

`Retry`操作符不會將原始Observable的`onError`通知傳遞給觀察者,它會訂閱這個Observable,再給它一次機會無錯誤地完成它的數據序列。`Retry`總是傳遞`onNext`通知給觀察者,由于重新訂閱,可能會造成數據項重復,如上圖所示。
RxJava中的實現為`retry`和`retryWhen`。
無論收到多少次`onError`通知,無參數版本的`retry`都會繼續訂閱并發射原始Observable。
接受單個`count`參數的`retry`會最多重新訂閱指定的次數,如果次數超了,它不會嘗試再次訂閱,它會把最新的一個`onError`通知傳遞給它的觀察者。
還有一個版本的`retry`接受一個謂詞函數作為參數,這個函數的兩個參數是:重試次數和導致發射`onError`通知的`Throwable`。這個函數返回一個布爾值,如果返回`true`,`retry`應該再次訂閱和鏡像原始的Observable,如果返回`false`,`retry`會將最新的一個`onError`通知傳遞給它的觀察者。
`retry`操作符默認在`trampoline`調度器上執行。
* Javadoc: [retry()](http://reactivex.io/RxJava/javadoc/rx/Observable.html#retry())
* Javadoc: [retry(long)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#retry(long))
* Javadoc: [retry(Func2)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#retry(rx.functions.Func2))
### retryWhen

`retryWhen`和`retry`類似,區別是,`retryWhen`將`onError`中的`Throwable`傳遞給一個函數,這個函數產生另一個Observable,`retryWhen`觀察它的結果再決定是不是要重新訂閱原始的Observable。如果這個Observable發射了一項數據,它就重新訂閱,如果這個Observable發射的是`onError`通知,它就將這個通知傳遞給觀察者然后終止。
`retryWhen`默認在`trampoline`調度器上執行,你可以通過參數指定其它的調度器。
示例代碼
```java
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
```
* Javadoc: [retryWhen(Func1)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#retryWhen(rx.functions.Func1))
* Javadoc: [retryWhen(Func1,Scheduler)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#retryWhen(rx.functions.Func1,%20rx.Scheduler))
- ReactiveX
- Observables
- Single
- Subject
- Scheduler
- Operators
- 創建操作
- Create
- Defer
- Empty/Never/Throw
- From
- Interval
- Just
- Range
- Repeat
- Start
- Timer
- 變換操作
- Buffer
- FlatMap
- GroupBy
- Map
- Scan
- Window
- 過濾操作
- Debounce
- Distinct
- ElementAt
- Filter
- First
- IgnoreElements
- Last
- Sample
- Skip
- SkipLast
- Take
- TakeLast
- 結合操作
- And/Then/When
- CombineLatest
- Join
- Merge
- StartWith
- Switch
- Zip
- 錯誤處理
- Catch
- Retry
- 輔助操作
- Delay
- Do
- Materialize/Dematerialize
- ObserveOn
- Serialize
- Subscribe
- SubscribeOn
- TimeInterval
- Timeout
- Timestamp
- Using
- To
- 條件和布爾操作
- All/Contains/Amb
- DefaultIfEmpty
- SequenceEqual
- SkipUntil/SkipWhile
- TakeUntil/TakeWhile
- 算術和聚合操作
- Average/Concat/Reduce
- Max/Min/Count/Sum
- 異步操作
- 連接操作
- Connect
- Publish
- RefCount
- Replay
- 轉換操作
- 阻塞操作
- 字符串操作
- 按字母順序的操作符列表
- RxJava文檔和教程
- RxJava入門指南
- RxJava使用示例
- 實現自定義操作符
- 自定義插件
- Backpressure
- 錯誤處理
- Android模塊
- 參與開發
- 補充閱讀材料