rxjava: Могу ли я использовать retry (), но с задержкой?
Я использую rxjava в своем приложении для Android для асинхронной обработки сетевых запросов. Теперь я хотел бы повторить неудачный сетевой запрос только по истечении определенного времени.
Есть ли способ использовать retry () в Observable, но повторять только после определенной задержки?
Есть ли способ сообщить Observable о том, что в настоящее время проводится повторная попытка (в отличие от первой попытки)?
Я посмотрел на debounce () / throttleWithTimeout (), но они, кажется, делают что-то другое.
Редактировать:
Я думаю, что нашел один способ сделать это, но мне было бы интересно либо подтверждение того, что это правильный путь, либо другие, более эффективные способы.
Что я делаю, так это: в методе call () моего Observable.OnSubscribe перед вызовом метода 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);
}
}
Так как этот метод в любом случае выполняется в потоке ввода-вывода, он не блокирует пользовательский интерфейс. Единственная проблема, которую я вижу, состоит в том, что даже первая ошибка сообщается с задержкой, поэтому задержка существует, даже если нет retry (). Я бы хотел, чтобы задержка не применяласьпосле ошибка, но вместодо повторная попытка (но не перед первой попыткой, очевидно).