2016-09-24 77 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它可以检测网络状态,但不能重试 –