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

Ren*_*ens 2 android rx-java retrofit2

我在日志中收到此错误:

Caused by java.lang.ClassCastException: java.net.UnknownHostException cannot be cast to retrofit2.adapter.rxjava.HttpException
Run Code Online (Sandbox Code Playgroud)

那就是我的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();
            }

        }
Run Code Online (Sandbox Code Playgroud)

Ale*_*yev 8

发生这种情况是因为您正在接收实例java.net.UnknownHostException而不是实例retrofit2.adapter.rxjava.HttpException.如果您查看该文档,它会说:

  • 直接主体(例如,Observable)调用onNext,使用反序列化的主体进行2XX响应,并使用HttpException调用onError以获取非2XX响应,并使用IOException调用网络错误.
  • 响应包装体(例如,Observable>)使用响应对象调用onNext以获取所有HTTP响应,并使用IOException调用onError以解决网络错误
  • 结果包装体(例如,Observable>)调用onNext,并为所有HTTP响应和错误调用Result对象.

所以你收到网络错误.

也看到这个

您可以像这样包装代码:

@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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)