我在日志中收到此错误:
Caused by java.lang.ClassCastException: java.net.UnknownHostException cannot be cast to retrofit2.adapter.rxjava.HttpException
那就是我的onError方法。该错误可能是在设备没有连接时引起的。
@Override
public void onError(Throwable e) {
assert e != null;
Timber.d(e);
HttpException exception = (HttpException) e;
assert view != null;
view.hideRefreshSpinner();
if (exception.code() == HttpURLConnection.HTTP_BAD_REQUEST) {
view.showSnackbarInvalidError();
} else {
view.showUnauthorizedError();
}
}
答案 0 :(得分:8)
这种情况正在发生,因为您正在接收java.net.UnknownHostException
而非retrofit2.adapter.rxjava.HttpException
的实例。如果你看doc,就会说:
- 直接主体(例如,Observable)使用反序列化主体调用onNext以获取2XX响应,并调用onError with 非2XX响应的HttpException和网络的 IOException 错误即可。
- 响应包装主体(例如,Observable>)调用onNext,并为所有HTTP响应调用Response对象并调用onError 使用IOException进行网络错误
- 结果包装正文(例如,Observable>)调用onNext,并为所有HTTP响应和错误调用Result对象。
因此您收到网络错误。
另见this
您可以像这样包装代码:
@Override
public void onError(Throwable e) {
assert e != null;
Timber.d(e);
if (e instanceof HttpException) {
assert view != null;
view.hideRefreshSpinner();
if (((HttpException) e).code() == HttpURLConnection.HTTP_BAD_REQUEST) {
view.showSnackbarInvalidError();
} else {
view.showUnauthorizedError();
}
}
}