2016-07-17 3 views
1

私はAndroidプロジェクトでRetrofit + RxJavaを使用しています。しかし、私のWebサービスには限界があります(1 reqest \ second)。だから、「ロード」ボタンを頻繁にクリックするとJSONがエラーで返されます。質問:成功していない限り、どのRxJava演算子を使用してクエリを再送信する必要がありますか?今私はちょうどonErrorメソッドが呼び出されているとそれはそれです。RxJavaで成功しない限り、リクエストを送信する方法は?

+1

「再試行」を試しましたか? -http://reactivex.io/documentation/operators/retry.html - 私は確信していませんが、実際にリクエストを再作成しないと思いますが、既にプロジェクトがあるので試してみることができると思いました – Fred

+0

'throttleFirst'?最初のイベントを発行し、その間に次のイベントをスキップします(ここでは1秒) – dwursteisen

答えて

0

retryWhen演算子を使用して、特定のユースケースで1秒の遅延を与えます。ここで

はダン・ルー同じトピックに関する詳細な説明は、it'sは、あなたがしてretryWhenを使用して、実行時例外をスローすることができない場合は、あなたが好きなようにJSONがないかどうかを確認する必要があり、http://blog.danlew.net/2016/01/25/rxjavas-repeatwhen-and-retrywhen-explained/

0

ですもう一度jsonを取得するために再試行できます。次に、すべての試行が失敗した場合、演算子onErrorResumeNextで最後のエラーを取得し、必要に応じてデフォルトのjsonを返します。

int count = 0; 

@Test 
public void observableOnErrorResumeNext() { 
    Subscription subscription = Observable.just(new JsonObject()) 
              .doOnNext(json -> if(json == BAD_JSON){ throw RuntimeException() }) 
              .retryWhen(errors -> errors.doOnNext(o -> count++) 
                    .flatMap(t -> count > 3 ? Observable.error(t) : Observable.just(null).delay(100, TimeUnit.MILLISECONDS)), 
                Schedulers.newThread()) 
              .onErrorResumeNext(t -> { 
               System.out.println("Error after all retries:" + t.getCause()); 
               return Observable.just("You can return here a default Json"); 
              }) 
              .subscribe(s -> System.out.println(s)); 
    new TestSubscriber((Observer) subscription).awaitTerminalEvent(500, TimeUnit.MILLISECONDS); 
} 

ここで必要な場合はさらに例を見ることができます。 https://github.com/politrons/reactive

関連する問題