Android 接收异常处理失败
我正在使用RxJava进行改造以进行API调用 通过使用RxJava方法,如flatMap和map,我在后台线程上进行API调用,并在room数据库中执行DB操作 我的实现是完美的,如果没有错误,工作正常,但在执行DB操作时出现错误或任何异常的情况下,应用程序会由于以下Rx错误而崩溃Android 接收异常处理失败,android,kotlin,retrofit2,rx-java2,Android,Kotlin,Retrofit2,Rx Java2,我正在使用RxJava进行改造以进行API调用 通过使用RxJava方法,如flatMap和map,我在后台线程上进行API调用,并在room数据库中执行DB操作 我的实现是完美的,如果没有错误,工作正常,但在执行DB操作时出现错误或任何异常的情况下,应用程序会由于以下Rx错误而崩溃 E/AndroidRuntime: FATAL EXCEPTION: RxCachedThreadScheduler-1 The exception was not handled due to missing
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()
})
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()
})
向数据库插入数据时出现异常
异常java.lang.IllegalStateException:尝试重新打开已关闭的对象:SQLiteDatabase:
但是错误没有得到处理,应用程序正在崩溃
错误表明subscribe()方法中缺少一个错误处理程序,但在我的代码中,我已经重写了throwable来处理异常/错误
任何人都可以找到,我遗漏了什么或者我在代码中犯了什么错误
更新 找到了解决方案,错误就在这里:
mDataManager.insertDataToDB(对象).subscribe()
在上面的语句中,我正在订阅,但没有处理该错误,因为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()
})
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()
})
以上代码运行良好 原因是您在这里订阅
.map {
// here inserting data to DB
mDataManager.insertDataToDB(object).subscribe()
return@map true
}
这个订阅没有处理错误场景
我觉得为内部流调用subscribe()不是一个好的做法。在您的场景中,流在两者之间被打断
根据我的说法,最好的方法是使用
flatMap{
object -> mDataManager.insertDataToDB(object)
}
这样,如果有任何错误,它将在最后一个外部订阅()中被捕获
希望这个答案有帮助。
mDataManager.insertDataToDB(object.subscribe()
缺少错误处理我尝试在数据插入后添加doError
和OneErrorReturn
,但不起作用如果在登录api中出现错误该怎么办。。您需要在登录响应平面图之前处理一个错误我想应该在throwable
@Moinkhan的最后处理这个错误我试过了谢谢您的回答!!,我尝试过你的解决方案,但仍然不起作用!!得到同样的错误。事实上你是对的,起初我只是尝试用flapMap替换map,但后来我尝试避免为所有flatMap和它的工作子脚本内部flapMap!检查我更新的问题和解决方案。正如我提到的,我们不应该在流中订阅。它只是打破了整个链条。