Я использую rxjava в своем приложении для Android для асинхронной обработки сетевых запросов. Теперь я хотел бы повторить неудачный сетевой запрос только по прошествии определенного времени.
Есть ли способ использовать retry () для Observable, но повторить попытку только после определенной задержки?
Есть ли способ сообщить Observable, что в настоящее время выполняется повторная попытка (а не в первый раз)?
Я посмотрел на debounce () / throttleWithTimeout (), но они, похоже, делают что-то другое.
Редактировать:
Я думаю, что нашел один способ сделать это, но мне было бы интересно либо подтверждение того, что это правильный способ сделать это, либо другие, лучшие способы.
Я делаю следующее: в методе call () моего Observable.OnSubscribe, прежде чем я вызываю метод Subscribers onError (), я просто позволяю Thread спать на желаемое время. Итак, чтобы повторить попытку каждые 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);
}
}
Поскольку этот метод в любом случае выполняется в потоке ввода-вывода, он не блокирует пользовательский интерфейс. Единственная проблема, которую я вижу, это то, что даже первая ошибка сообщается с задержкой, поэтому задержка есть, даже если нет retry (). Я бы хотел, чтобы задержка применялась не после ошибки, а перед повторной попыткой (но, очевидно, не до первой попытки).
Error:(73, 20) error: incompatible types: RetryWithDelay cannot be converted to Func1<? super Observable<? extends Throwable>,? extends Observable<?>>