Android Observer.onError不一致地发射
我正在使用改装来访问我的API,如下所示: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
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()未调用。很好的建议!