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