В приложении для Android процесс выглядит следующим образом: сначала я извлекаю заметки из локального SQLite, а затем делаю вызовы Http для каждой заметки. Я использую составные одноразовые элементы, чтобы хранить все одноразовые элементы и высвобождать их при уничтожении активности. Код выглядит примерно так:
class MyActivity : AppCompatActivity(){
var compositeDisposable = CompositeDisposable()
override fun onResume(){
updateDatabaseData()
}
fun updateDatabaseData(){
compositeDisposable.add(
Observable.fromCallable{
fetchDataFromDatabase()
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap{
Observable.fromIterable(it)
}
.flatMap{
getUpdateStateObservable(it) // make remote HTTP call for every note in the list from local DB
}
.subscribe()
)
}
fun getUpdateStateObservable(note:Note):UpdatedNote{
Observable.fromCallable(
// make HTTP call and build some UpdatedNote
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
}
fun fetchDataFromDatabase():List<Note>{
// fetch data from local DB
}
}
И этот код работал исправно до того момента, пока не пропал интернет. Таким образом, каждый раз, когда HTTP-вызовы в методе getUpdateStateObservable
выполняются, возникает ошибка. И иногда это приводит к тому, что io.reactivex.exceptions.UndeliverableException
указывает на строку, где происходит сетевая ошибка в getUpdateStateObservable
. А иногда это не так. Я пытался использовать не пул потоков, а один как Schedulers.single()
при выполнении HTTP-запроса. И это хорошо работает. Однако я хотел бы обрабатывать все эти запросы одновременно, чтобы ускорить их.
Спасибо
getUpdateStateObservable
каждый вызов HTTP приводит к исключению. Проблема заключается в том, что эти исключения происходят одновременно (см.subscribeOn(Schedulers.io())
), что приводит к исключению UndeliverableException. Но когда я переключаюсь на обработку запросов последовательно какSchedulers.single()
, это работает хорошо. Почему это? - person Allison Catcher   schedule 15.02.2020