Ошибка обработки исключения Rx - PullRequest
0 голосов
/ 05 декабря 2018

Я использую 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()
            })

Над кодом работает отлично!

1 Ответ

0 голосов
/ 05 декабря 2018

Причина в том, что вы подписываетесь здесь

.map {
    // here inserting data to DB
    mDataManager.insertDataToDB(object).subscribe()
    return@map true
}

И эта подписка не обрабатывает сценарий ошибки.

Мне кажется, что не рекомендуется вызывать метод subscribe () для внутреннегопотоки.В вашем сценарии поток прерывается между ними.

На мой взгляд, лучший способ - вместо использования map и вызова подписки (), используйте

flatMap{
    object -> mDataManager.insertDataToDB(object)
}

Таким образом, еслилюбая ошибка будет обнаружена в последнем внешнем подписчике ().

Надеюсь, этот ответ поможет.

...