Пожалуйста, попробуйте следующий подход, который я использую для моего проекта.
Создайте класс (это Java-класс, вы можете изменить его на kotlin, если требуется)
public class RetryWithDelay implements Function<Observable<? extends Throwable>, Observable<?>> {
private static final String TAG = "RetryWithDelay";
private final int maxRetries;
private final int retryDelayInMinutes;
private int retryCount;
public RetryWithDelay(final int maxRetries, final int retryDelayInMinutes) {
this.maxRetries = maxRetries;
this.retryDelayInMinutes = retryDelayInMinutes;
this.retryCount = 0;
}
@Override
public Observable<?> apply(Observable<? extends Throwable> attempts) {
return attempts.flatMap(new Function<Throwable, Observable<?>>() {
@Override
public Observable<?> apply(Throwable throwable) {
if (throwable instanceof TimeoutException) {
return Observable.error(throwable);
}
if (++retryCount < maxRetries) {
// When this Observable calls onNext, the original
// Observable will be retried (i.e. re-subscribed).
return Observable.timer(retryDelayInMinutes, TimeUnit.MINUTES);
}
// Max retries hit. Just pass the error along.
return Observable.error(throwable);
}
});
}}
ВнутриПрименить метод, он проверит, является ли исключение экземпляром TimeOut, он выдаст ошибку, в противном случае он продолжит повторную попытку для желаемого maxRetries.
И передаст этот класс, как показано ниже
.retryWhen (new RetyWithDelay(3,5))
Где он будет повторяться 3 раза каждые 5 минут.