java - 在嵌套 Flowable 的 onNext 中抛出异常会导致 UndeliverableException

标签 java android kotlin rx-java2

我在存储库中有这样的代码:

return Completable.fromAction {
    // Some code
    loginService.login(id)
        .subscribe(
            { response ->
                if(response.isNotSuccessful()) {
                    throw Exception()
                }
                // Some code
            },
            { e ->
                throw e
            }
    )
}

我在 ViewModel 中编写了这样的代码:

fun onLoginAction(id) {
    repository.login(id)
        .subscribe(
            {
                showSuccess()
            },
            {
                showFailure()
            }
    )
}

基本上,ViewModel 调用存储库中的登录方法,该方法返回Completable

当响应不成功时,这会导致 UndeliverableException。我希望调用 Completable 订阅者的 onError() 方法。我该怎么做?

最佳答案

我没有足够的知识来肯定地说出这一点,但我仍然认为这对您有一些值(value),而且对于评论来说太大了。

这就是我认为正在发生的事情。当 onError 失败时,rx 不会通过相同的可观察流运行它。相反,它会将其传播到 RxPlugins 错误处理程序,并最终传播到系统中的默认异常处理程序。你可以找到这个here .

这就是说,当 loginService.login(id)onError 中抛出异常时,Completable 流不会有有机会捕获它并将其转发到外部订阅的 onError 。换句话说,可完成流独立于登录服务流。

通常,您希望创建一个流并让 View 模型订阅它。如果您有多个流,rx 有大量运算符来帮助您链接这些流。尝试使存储库从服务返回一个流。像这样的事情:

fun login(id) = loginService.login(id)

现在在 View 模型上,您可以使用相同的方法检查调用是否成功 - response.isNotSuccessful()

关于java - 在嵌套 Flowable 的 onNext 中抛出异常会导致 UndeliverableException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54169125/

相关文章:

Android从图库上传图片到服务器

java - 使用 Navigation 包中的 startActivity

Kotlin 主构造函数调用辅助构造函数

Kotlin:可以在编译期间通过元编程修改函数吗?

java - 在 TextArea JAVA 中读取文件

java - Android studio crossfade drawables 崩溃应用程序

java - 如何从 JNativeHook 库中删除日志记录数据

java - 如何使 java 类在运行时根据需要表现得像普通对象和对象列表?

android - 如何在单击按钮时移动到 recyclerview 中的下一个对象

kotlin - 循环依赖(Voronoi Halfedge)