Androidアプリでrxjavaを使用して、ネットワーク要求を非同期で処理しています。ここで、一定の時間が経過した後にのみ、失敗したネットワーク要求を再試行したいと思います。
Observableでretry()を使用する方法はありますか?ただし、一定の遅延の後にのみ再試行しますか?
現在初めて再試行されているのではなく、現在再試行中であることをObservableに知らせる方法はありますか?
debounce()/ throttleWithTimeout()を確認しましたが、別のことをしているようです。
編集:
私はそれを行う1つの方法を見つけたと思いますが、これが正しい方法であるかどうかの確認、または他のより良い方法に興味があります。
私がやっていることは次のとおりです。Observable.OnSubscribeのcall()メソッドで、Subscribers onError()メソッドを呼び出す前に、スレッドを必要な時間だけスリープさせます。したがって、1000ミリ秒ごとに再試行するには、次のようにします。
@Override
public void call(Subscriber<? super List<ProductNode>> subscriber) {
try {
Log.d(TAG, "trying to load all products with pid: " + pid);
subscriber.onNext(productClient.getProductNodesForParentId(pid));
subscriber.onCompleted();
} catch (Exception e) {
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e.printStackTrace();
}
subscriber.onError(e);
}
}
このメソッドはIOスレッドで実行されているため、UIをブロックしません。私が見ることができる唯一の問題は、最初のエラーが遅延して報告されるため、retry()がなくても遅延が発生することです。エラーの後で遅延が適用されず、代わりに再試行の前に(ただし、最初の試行の前ではなく)遅延が適用された場合は、もっと良いと思います。
Error:(73, 20) error: incompatible types: RetryWithDelay cannot be converted to Func1<? super Observable<? extends Throwable>,? extends Observable<?>>