Я использую 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 (). Я бы хотел, чтобы задержка применялась не после ошибки, а перед повторной попыткой (но, очевидно, не до первой попытки).