我正在使用 Retrofit 访问我的 API,如下所示:
public interface UserService {
...
@POST("/user/login")
public Observable<User> register(@Body() User user);
}
这是我访问 API 的方式:
mUserService.register(user)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<User>() {
@Override
public void onCompleted() {
....
}
@Override
public void onError(Throwable e) {
....
}
@Override
public void onNext(User user) {
....
}
});
这工作得很好,除非出现异常(即 IOException,或连接超时),onError 方法不会被触发,而是我在主线程上遇到异常终止我的应用程序。
但是,对于某些情况(例如当 API 调用以状态代码 400 响应时),onError 方法会按预期触发。
在挖掘 logcat 输出后,我发现了这一行,(不确定我应该如何处理它)
rx.exceptions.OnErrorFailedException:尝试将错误传播到 Observer.onError 时发生错误
谁能告诉我哪里做错了?
最佳答案
根据我之前使用 RxJava 的经验,OnErrorFailedException
意味着在 onError
方法中处理另一个异常时发生异常。
如果您没有看到真正原因的堆栈跟踪,则可能是由于 RxJava 中的 CompositeException
错误(0.19.2 及更高版本)https://github.com/Netflix/RxJava/issues/1405
作为解决方法,请尝试将您的 onError
代码包装在 try-catch
block 中并记录异常。通过这种方式,您将看到您的 onError
实现有什么问题,并且您将能够解决问题。
@Override
public void onError(Throwable e) {
try {
...
catch(Throwable e) {
// Log the exception
}
}
关于android - Observer.onError 触发不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24860942/