Observer.onError发射不一致

我正在使用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) { .... } }); 

这工作得很好,除非有exception(即IOException或连接超时),onError方法不会被触发,而是在终止我的应用程序的主线程上得到exception。

但是,对于某些情况(例如,当API调用响应状态代码400时),将按预期触发onError方法。

挖掘logcat输出后,我发现这一行,(不知道我应该如何处理这个)

rx.exceptions.OnErrorFailedException:尝试将错误传播到Observer.onError时发生错误

有人可以让我知道我做错事的地方吗?

Solutions Collecting From Web of "Observer.onError发射不一致"

在我以前使用RxJava的经验中,OnErrorFailedException意味着在处理onError方法中的另一个exception时发生exception。

如果你没有看到真正原因的堆栈跟踪,可能是由于RxJava中的CompositeException (版本0.19.2及以上版本)造成的错误https://github.com/Netflix/RxJava/issues/1405

作为一种解决方法,尝试在try-catch块中包装onError代码并loggingexception。 这样你会看到你的onError实现有什么问题,你将能够解决这个问题。

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

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

 ... .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) { .... } }); ...