java.net.UnknownHostException无法使用RxJava强制转换为retrofit2.adapter.rxjava.HttpException

时间:2016-12-24 09:38:14

标签: android rx-java retrofit2

我在日志中收到此错误:

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();
            }

        }

1 个答案:

答案 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();
        }
    }
}