2016-09-24 7 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:// reactx。 io/documentation/operators/retry.html#collapseRxJava) – EpicPandaForce

答えて

0

PublishSubjectを作成し、retryWhen(subject)を追加してください。

接続の変更をリッスンし、ネットワークが利用可能になったらsubject.onNext(null)と呼び出し、rxチェーンが停止していると再試行します。

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

他のノート...のTextViewのイベントがmainThread由来として

.subscribeOn(AndroidSchedulers.mainThread())は不要です。

.observeOn(Schedulers.io())が必要でない場合や、debounceでスケジューラを特別に設定することができます。

+0

私のコードを変更しました: –

+0

.retryWhen(observable-> observable.flatMap(throwable - > { IF(スロー可能オブジェクトのinstanceofのRetrofitError){ (((RetrofitError)スロー可能).getKind()== RetrofitError.Kind.NETWORK) リターンObservable.error(スロー可能)であれば、 }戻りObservable.timer(3、 TimeUnit.SECONDS); })) .subscribe(results - > showResult(results)、error-> setError(error.getMessage())); ネットワーク状態を検出できますが、再試行できません –

関連する問題