我用rxjava2 + retrofit2 + okhttp3在我的Android应用程序,当应用程序没有连接到互联网
问题描述:
我已经找到了一些解决方案(OnErrorNotImplementedException when Interceptor throws.),但我仍然得到OnErrorNotImplementedException
和SocketTimeoutException
和应用程序崩溃得到坠毁。我用rxjava2 + retrofit2 + okhttp3在我的Android应用程序,当应用程序没有连接到互联网
我的代码来处理HTTP结果:
observable.compose(TransformerHelper.<Response<T>>io_main()).doOnSubscribe(new Consumer<Disposable>() {
@Override
public void accept(@io.reactivex.annotations.NonNull Disposable disposable) throws Exception {
requestCallback.onBefore();
}
}).doOnError(new Consumer<Throwable>() {
@Override
public void accept(@io.reactivex.annotations.NonNull Throwable throwable) throws Exception {
requestCallback.onAfter();
requestCallback.onError(throwable);
}
}).doOnComplete(new Action() {
@Override
public void run() throws Exception {
requestCallback.onAfter();
}
}).onErrorReturn(new Function<Throwable, Response<T>>() {
@Override
public Response<T> apply(@io.reactivex.annotations.NonNull Throwable throwable) throws Exception {
return null;
}
}).subscribe(new Consumer<Response<T>>() {
@Override
public void accept(@io.reactivex.annotations.NonNull Response<T> response) throws Exception {
try {
requestCallback.onAfter();
if (response.isSuccess()) {
requestCallback.onSuccess(response.data, response.msg);
} else {
requestCallback.onBizErr(response.code, response.msg);
}
} catch (Exception e) {
requestCallback.onAfter();
requestCallback.onError(e.getCause());
}
}
}, new Consumer<Throwable>() {
@Override
public void accept(@io.reactivex.annotations.NonNull Throwable throwable) throws Exception {
requestCallback.onAfter();
requestCallback.onError(throwable);
}
});
答
return null;
- 在RxJava2 null
不能再被发射到流(What's Different in 2.0)。这意味着返回null
只会导致NPE发射。
简而言之,您需要为失败的请求定义有效的替换或定义处理异常的方法。否则,它将由会导致应用程序崩溃的默认异常处理程序处理。
如果您想增加获得答案的机会,您应该将其粘贴到堆栈跟踪中。另外,为什么你在'onErrorReturn'中返回null。 'null'没有isSuccess方法。 – Lukasz