RxJava's retryWhen operator - PullRequest
       17

RxJava's retryWhen operator

0 голосов
/ 02 ноября 2018

Я пытаюсь понять retryWhen оператор, и у меня есть некоторый код, как показано ниже.

    Flowable.just(1, 2, 3, 4, 5)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .retryWhen { throwable ->
                Log.d("Debug", "retryWhen proceed...")
                throw Exception("There is a exception")
            }
            .subscribe(
                    { item ->
                        Log.d("Debug", "success : $item")
                    },
                    { throwable ->
                        Log.d("Debug", "error : ${throwable.message}")
                    },
                    {
                        Log.d("Debug", "complete")
                    }
            )

И результат показан ниже.

Отладка: повторите при продолжении ...

Отладка: ошибка: исключение

Вопрос в том, когда при повторной попытке запускается оператор?

Я предполагаю, что retryWhen оператор будет запущен только при возникновении исключения.

Но результат явно не тот, о котором я думал,

Есть мысли по этому поводу? Спасибо!

1 Ответ

0 голосов
/ 02 ноября 2018

retryWhen { errors -> ... } принимает Observable<Throwable> и должно вернуть Observable, которое возвращает что-либо для повтор или ошибку для прекратить повтор .

Один пример может быть:

.retryWhen(attempts -> {
  return attempts.zipWith(Observable.range(1, 3), (n, i) -> i).flatMap(i -> {
    System.out.println("delay retry by " + i + " second(s)");
    return Observable.timer(i, TimeUnit.SECONDS);
  });
})

(взято из http://reactivex.io/documentation/operators/retry.html)
Этот код будет задерживать каждую попытку.

Между прочим, в этом методе не нужно создавать исключение.

Документация:
* Отличная статья в блоге , в которой объясняется retryWhen

...