Observer.onError不一致地触发

时间:2014-07-21 08:45:39

标签: android retrofit rx-java

我使用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时发生错误

有人能让我知道我做错了什么吗?

2 个答案:

答案 0 :(得分:15)

在我之前使用RxJava的经历中,OnErrorFailedException表示在onError方法中处理另一个异常时发生了异常。

如果您没有看到真实原因的堆栈跟踪,可能是因为RxJava中的错误CompositeException(版本0.19.2及更高版本)https://github.com/Netflix/RxJava/issues/1405

作为一种解决方法,尝试将onError代码封装在try-catch块中并记录异常。通过这种方式,您可以了解onError实施的问题,并且您将能够解决问题。

@Override
public void onError(Throwable e) {
   try {
      ...
   catch(Throwable e) {
      // Log the exception
   }
}

答案 1 :(得分:0)

您可以使用不安全的unsafeSubscribe。

...
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.unsafeSubscribe(new Observer<User>() {
    @Override
    public void onCompleted() {
    ....
    }

    @Override
    public void onError(Throwable e) {
    ....
    }

    @Override
    public void onNext(User user) {
    ....
    }
});
...