Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 接收异常处理失败_Android_Kotlin_Retrofit2_Rx Java2 - Fatal编程技术网

Android 接收异常处理失败

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

我正在使用RxJava进行改造以进行API调用

通过使用RxJava方法,如flatMapmap,我在后台线程上进行API调用,并在room数据库中执行DB操作

我的实现是完美的,如果没有错误,工作正常,但在执行DB操作时出现错误或任何异常的情况下,应用程序会由于以下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()
                })
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!检查我更新的问题和解决方案。正如我提到的,我们不应该在流中订阅。它只是打破了整个链条。