Вызов независимых сетевых вызовов параллельно с RxJava и обработка ошибки

#android #rx-java2

#Android #rx-java2

Вопрос:

Я пытаюсь вызвать несколько сетевых вызовов (всего 5), каждый из которых независим от других. Я знаю, как вызывать сетевые вызовы в цепочке с помощью RxJava. Но при вызове по цепочке, если при вызове 3-го или 4-го сетевого вызова возникает ошибка, остальные вызовы выполняться не будут. Поэтому я хочу, чтобы остальные сетевые вызовы продолжали выполняться, даже если предыдущие вызовы завершились неудачей. Есть ли способ найти решение для этой ситуации?

Ответ №1:

Да, есть, вы можете использовать onErrorResumeNext. пример моего кода :

primaryMenuFetcher.getMenu()
.observeOn(uiScheduler)
.flatMap { menuItems ->
onView {
primaryMenu = menuItems
setPrimaryMenuList(primaryMenu)
}
return@flatMap model.getPromotions()
}
.onErrorResumeNext { return@onErrorResumeNext model.getPromotions() }
.observeOn(uiScheduler)
.doFinally { onView { hideProgressBar() } }
.subscribe({ fetchedLeagues ->
onView {
featuredLeagues = fetchedLeagues
showPopularLeagues()
setPopularLeaguesList(featuredLeagues)
}
}, {
showError()
})

Существуют также другие варианты обработки ошибок Rx2. Обратитесь к документации

Комментарии:

1. Я попробую с этим. Спасибо

2. Нет проблем, спросите, нужна ли дополнительная помощь. Если все в порядке, пожалуйста, отметьте как ответивший 🙂

3. Почему вы удалили флаг ответа?

Ответ №2:

Я думаю, что одной из лучших вещей здесь было бы mergeDelayError. Это задержит ошибки до завершения всех наблюдаемых или с ошибками.

Это было бы одним из вариантов:

 Observable.mergeDelayError(
     obs1.subscribeOn(Schedulers.io()),
     obs2.subscribeOn(Schedulers.io()),
     //...
 )
 .subscribe();
  

subscribeOn Это больше для гарантии того, что запросы выполняются параллельно. Я не знаю, является ли io планировщик наиболее подходящим в этом сценарии, но у меня он работал.

Если поток выдает ошибки, вы получите составное исключение с каждой проблемой, возникшей для каждого отдельного наблюдаемого. Если вам нужно проверить их по отдельности, вы можете посмотреть на это исключение.

Комментарии:

1. Что вы имеете в виду? Я опубликовал код в ответе. Что еще вам нужно?