У вас есть много способов сделать это. Я собираюсь ограничиться, чтобы объяснить, как этого добиться, используя два Completable
s
Допустим, у вас есть два завершаемых:
Completable doSomething = ...
Completable doSomethingElse = ...
Чтобы выполнить их последовательно,
Вы можете объединить их, используя оператор andThen
. Затем, чтобы отложить повторную попытку при возникновении ошибки, вы можете использовать retryWhen
:
doSomething.andThen(doSomethingElse)
.retryWhen { Flowable.timer(2, TimeUnit.SECONDS) }
.subscribe()
Этот фрагмент выше будет повторяться бесконечно, если ошибка постоянно возникает. Чтобы выйти за пределы, вы можете ограничить количество попыток, используя:
.retryWhen { errors ->
val retryCounter = AtomicInteger()
errors.flatMap {
if (retryCounter.getAndIncrement() <= 3)
Flowable.timer(2, TimeUnit.SECONDS)
else Flowable.error(it)
}
}
Если вы хотите повторить попытку только при возникновении данного типа ошибки, вы можете использовать:
.retryWhen { errors ->
val retryCounter = AtomicInteger()
errors.flatMap {
if (it is YourSpecficError && retryCounter.getAndIncrement() <= 3)
Flowable.timer(2, TimeUnit.SECONDS)
else Flowable.error(it)
}
}
Если вы хотите повторить попытку независимо, вы можете использовать:
doSomething.retryWhen { ... }
.andThen(doSomethingElse.retryWhen { ... })
.subscribe()
Кроме того, чтобы избежать повторных попыток при дублировании логики, вы можете заключить это в функцию расширения:
fun Completable.retryDelayed(): Completable {
return this.retryWhen { errors ->
val retryCounter = AtomicInteger()
errors.flatMap {
if (it is YourSpecficError && retryCounter.getAndIncrement() <= 3)
Flowable.timer(2, TimeUnit.SECONDS)
else Flowable.error(it)
}
}
}
Если вы хотите запустить ваши завершаемые таблицы параллельно, вы можете использовать оператор merge
:
Completable doAll = Completable.merge(listOf(doSomething, doSomething))