我在存储库中有这样的代码:
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/