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