2016-09-24 70 views
1

如何在Android中的rxJava出現網絡錯誤時進行重試網絡調用。在RxJava中重試網絡呼叫

這裏是我的rxJave代碼:

RxTextView.textChanges(searchInput) 
      .debounce(500, TimeUnit.MILLISECONDS) 
      .map(CharSequence::toString) 
      .filter(s -> !s.isEmpty()) 
      .subscribeOn(AndroidSchedulers.mainThread()) 
      .observeOn(Schedulers.io()) 
      .switchMap(query -> getTypedPlaces(query)) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(results -> showResult(results)); 

它工作得很好,但我需要重新嘗試網絡請求時連接中斷。

+0

您試過['retry()'](http://reactivex.io/documentation/operators/retry.html)運算符嗎? – EpicPandaForce

+0

爲了首先使用retry(),我必須檢測網絡連接。如果有網絡錯誤,我該如何檢測網絡連接?如何重新嘗試 –

+0

您可以看看['retryWhen()'](http:// reactivex。 io/documentation/operators/retry.html#collapseRxJava) – EpicPandaForce

回答

0

製作一個PublishSubject並添加retryWhen(subject)

然後監聽連接的更改,並在網絡可用時調用subject.onNext(null),並且如果您的rx鏈停滯不前,它將重試。

.switchMap(query -> getTypedPlaces(query).retryWhen(subject)) 

其他注意事項...

.subscribeOn(AndroidSchedulers.mainThread())是多餘的,因爲在TextView的事件從mainThread起源。

.observeOn(Schedulers.io())可能沒有必要,或者您可以將調度程序專門設置爲去抖動。

+0

我改變了我的代碼: –

+0

.retryWhen(observable - > observable.flatMap(throwable - > { 如果(拋出的instanceof RetrofitError){ 如果(((RetrofitError)拋出).getKind()== RetrofitError.Kind.NETWORK) 返回Observable.error(拋出); } 返回Observable.timer(3, (結果 - > showResult(結果),error-> setError(error.getMessage()));}};}} .subscribe(result - > showResult它可以檢測網絡狀態,但不能重試 –