10

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

有人可以让我知道我在哪里做错了吗?

4

2 回答 2

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
   }
}
于 2014-07-21T12:23:00.773 回答
0

你可以使用不安全的不安全订阅。

...
.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) {
    ....
    }
});
...
于 2016-08-31T20:09:46.827 回答