android - Observer.onError 触发不一致

标签 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 时发生错误

谁能告诉我哪里做错了?

最佳答案

根据我之前使用 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/

相关文章:

android - 在 Android 中将城市和街道添加到个人详细信息

android - 带jar输出的自定义gradle项目

kotlin - RxJava 如何将 Rxjava 中的 Single<T> 转换为 Retrofit 中的 Call<T> 或相反转换

java - 使用 Retrofit 时,当回复有时是对象有时是数组时,如何解析 JSON 回复?

java - WebView不断爆发

android - file.createNewFile() 给出 java.io.IOException : Not a directory

android - 将纯文本作为 POST 正文发送会导致改造出现问题

java - GSON:不调用我的解串器

android - 如何在 RxJava 中使用长处理任务对事件流进行去抖动

rxjs - 在 Rx 中,我可以获取完整的序列,而不是仅获取最后一个去抖对象吗?