Android Observer.onError不一致地发射

Android Observer.onError不一致地发射,android,retrofit,rx-java,Android,Retrofit,Rx Java,我正在使用改装来访问我的API,如下所示: public interface UserService { ... @POST("/user/login") public Observable<User> register(@Body() User user); } 公共接口用户服务{ ... @POST(“/user/login”) 公共可观察寄存器(@Body()User); } 以下是我访问API的方式: mUserService.register(u

我正在使用改装来访问我的API,如下所示:

public interface UserService {
    ...
    @POST("/user/login")
    public Observable<User> register(@Body() User user);
}
公共接口用户服务{
...
@POST(“/user/login”)
公共可观察寄存器(@Body()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) {
    ....
    }
});
mUserService.register(用户)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.订阅(新观察员){
@凌驾
未完成的公共无效(){
....
}
@凌驾
公共无效申报人(可丢弃的e){
....
}
@凌驾
public void onNext(用户){
....
}
});
这工作得非常好,除非出现异常(即IOException,或连接超时),否则不会触发OneError方法,而是在终止应用程序的主线程上获得异常

但是,在某些情况下(例如当API调用以状态代码400响应时),会按预期触发onError方法

在挖掘logcat输出后,我发现了这条线(不确定该如何处理)

rx.exceptions.OnErrorFailedException:尝试将错误传播给观察者时出错。onError


有人能告诉我哪里做错了吗?

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

如果您没有看到真正原因的堆栈跟踪,则可能是由于RxJava中带有
CompositeException
(版本0.19.2及以上)的错误造成的

作为一种解决方法,请尝试将
onError
代码包装在
try catch
块中并记录异常。这样,您将看到您的
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) {
    ....
    }
});
...
。。。
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.unsafeSubscribe(新观察员){
@凌驾
未完成的公共无效(){
....
}
@凌驾
公共无效申报人(可丢弃的e){
....
}
@凌驾
public void onNext(用户){
....
}
});
...

问题是OneError方法根本不会被调用。因此,不需要用try-catch块来包装它。您是否有任何代码片段显示尽管抛出异常但仍不调用onError方法的情况?我也有同样的问题。从未调用订阅者的onError方法,但如果使用回调,则会完美地调用它。关于这一点有什么消息吗?在最新版本中,由于OneError()中的NPE,我出现了此错误,因此您的
try catch
允许我识别问题并添加修复程序。ThxMine是Looper.prepare()未调用。很好的建议!