Вы можете использовать zipWith
с range
для достижения этой цели.
.retryWhen { errors -> errors.zipWith(Observable.range(1, 3), { _, i -> i }) }
Оператор retryWhen
предоставляет вам поток всех ошибок от вашего исходного издателя. Здесь вы заархивируете их числами 1, 2, 3. Поэтому результирующий поток будет излучать 3 next
, а затем complete
. Вопреки тому, что вы думаете, это повторяет подписку только дважды, поскольку complete
, испускаемый сразу после третьего next
, приводит к завершению всего потока.
Вы можете расширить это, повторив попытку только для некоторых ошибок, в то же время немедленно потерпев неудачу для других. Например, если вы хотите повторить попытку только для IOException
, вы можете расширить приведенное выше решение до:
.retryWhen { errors -> errors
.zipWith(Observable.range(1, 3), { error, _ -> error })
.map { error -> when (error) {
is IOException -> error
else -> throw error
}}
}
Поскольку map
не может генерировать проверенное исключение в Java, пользователи Java могут использовать flatMap
для той же цели.