【问题标题】:Observer.onError firing off inconsistentlyObserver.onError 触发不一致
【发布时间】:2014-07-21 08:45:39
【问题描述】:

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

谁能告诉我我哪里做错了?

【问题讨论】:

    标签: android retrofit rx-java


    【解决方案1】:

    在我之前使用 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
       }
    }
    

    【讨论】:

    • 问题是 onError 方法根本没有被调用。所以不需要用 try-catch 块包装它。
    • 是否有任何代码 sn-p 显示尽管抛出异常但未调用 onError 方法的情况?
    • 我遇到了同样的问题。订阅者的 onError 方法永远不会被调用,但如果我使用回调,它会被完美地调用。有这方面的消息吗?
    • 在最新版本中,由于 onError () 中的 NPE 而出现此错误,因此您的 try catch 允许我识别问题并添加修复程序。谢谢
    • 我的是 Looper.prepare() 没有被调用。很好的建议!
    【解决方案2】:

    你可以使用 unsafe 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) {
        ....
        }
    });
    ...
    

    【讨论】:

      猜你喜欢
      • 2018-07-27
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      • 2018-04-27
      相关资源
      最近更新 更多