2017-10-23 7 views
0

私は、次の要件がありますRetrofit + RxJava - エラー時にキャッシュ/パブリッシュして再試行しますか?

  1. 複数のオブザーバー(フラグメント)は、データ・ソースに加入する必要があります。
  2. アクティビティがネットワーク要求を開始します。要求が成功すると、各オブザーバは結果を受け取ります。

キャッシュ/パブリッシュ演算子を使用して実行しようとしましたが、最初のリクエストでエラーが返される問題があります。この時点で私はストリームをリセットしたいし、その後メソッドを呼び出すたびにエラーを返すのではなく、新しいネットワーク要求を実行する必要があります。

ここに私が現在持っているものがあります。

private Flowable<List<Data>> dataObservable; 

private Flowable<List<Data>> getData(){ 
    if(dataObservable == null){ 
     dataObservable = apiService.getData() 
       .doOnError(throwable -> { 
        dataObservable = null; 
       }) 
       .cache(); 
    } 
    return dataObservable; 
} 

これは機能しますが、コードは間違っています。より良い方法が必要です。

答えて

0

事前観察可能なものを定義することができ、何かを購読するまで実際に何もしません。それはあまり心配する価値がないnullです。

retry()演算子またはその変形を使用して、エラーの発生時に自動的にネットワーク操作を再試行できます。

最後に、cache()オペレータは、1つのネットワーク接続サブスクリプションだけがアクティブであることを保証します。各サブスクライバは、オブザーバブルからの更新を取得し、発生したネットワークエラーを認識しません。

+0

問題は、retry()演算子が私からの入力なしで無限に再試行を続けるということです。 –

+0

さまざまな引数を取る 'retry()'演算子がいくつかあります。これは良い紹介です:http://blog.danlew.net/2016/01/25/rxjavas-repeatwhen-and-retrywhen-explained/ –

関連する問題