Я использую RxJava с модернизацией для выполнения вызовов API,
Используя методы RxJava, такие как flatMap и map Я также делаю вызовы APIкак выполнение операций БД в базе данных комнаты в фоновом потоке.
Моя реализация идеальна и работает нормально, если нет ошибки, но в случае, когда я получил ошибку или любое исключение при выполнении операции БД, получение приложенияпроизошел сбой из-за следующей ошибки Rx.
E/AndroidRuntime: FATAL EXCEPTION: RxCachedThreadScheduler-1
The exception was not handled due to missing onError handler in the subscribe() method call.
Я использовал RxJava для выполнения своей операции, как показано ниже:
mDataManager.login(params)
.flatMap { loginResponse: LoginResponse ->
// here making another API call based on previos API result
return@flatMap mDatamanager....
}
.flatMap { object: SomeDataModel ->
// here inserting data to DB
mDataManager.insertDataToDB(object).subscribe()
// here making another API call based on previos API
return@flatMap mDataManager...
}.map {
// here inserting data to DB
mDataManager.insertDataToDB(object).subscribe()
return@map true
}
.observeOn(mSchedulerProvider.ui())
.subscribeOn(mSchedulerProvider.io())
.subscribe({ result ->
// updating view
}, { throwable ->
throwable.printStackTrace()
})
Я получаю исключение при вставке данных в DB
Исключение java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase:
Но ошибка не обработана, и приложение получает сбой.
Ошибка говорит о том, что missing onError handler in the subscribe() method
, но в моем коде я уже переопределил throwable для обработки исключения / ошибок.
Может кто-нибудь найти, что я пропустил или какую ошибку я совершил в коде.
ОБНОВЛЕНИЕ
Нашел решениеОшибка была здесь:
mDataManager.insertDataToDB(object).subscribe()
В выражении Above я подписываюсь, но не обрабатывал ошибку для этого, и из-за этой ошибки rxJava не был обработан, и в результате приложение перестало работать.
Окончательный код, как показано ниже:
mDataManager.login(params)
.flatMap { loginResponse: LoginResponse ->
// here making another API call based on previos API result
return@flatMap mDatamanager....
}
.flatMap { object: SomeDataModel ->
// avoid this inner subscribe
// mDataManager.insertDataToDB(object).subscribe()
return@flatMap mDataManager.insertDataToDB(object)
}
.flatMap {
// here making another API call based on previos API result
return@flatMap mDatamanager....
}
.flatMap {
// avoid this inner subscribe
//mDataManager.insertDataToDB(object).subscribe()
return@flatMap mDataManager.insertDataToDB(object)
}
.observeOn(mSchedulerProvider.ui())
.subscribeOn(mSchedulerProvider.io())
.subscribe({ result ->
// updating view
}, { throwable ->
throwable.printStackTrace()
})
Над кодом работает отлично!