带自定义响应的Retrofit 2 Handle Socket超时异常

时间:2018-07-30 15:08:59

标签: android retrofit2 okhttp3 okhttp

我想在Interceptor for Retrofit 2中为各种异常(如套接字超时,404错误等)创建自定义响应。

下面是我的代码:

Interceptor responseCodeInterceptor = (Interceptor.Chain chain) -> {
        Request request = chain.request();
        okhttp3.Response response = null;
        try {
            response = chain.proceed(request);

            if (response != null) {
                switch (response.code()) {
                    case 401:
                           // todo   
                       break;
                    case 404: // todo
                        break;
                }
            }
        } catch (SocketTimeoutException e) {
            JSONObject jsonObject = new JSONObject();
            try {
                jsonObject.put("status", "Error");
                jsonObject.put("errors", "Socket time out exception");

                ResponseBody body = ResponseBody.create(MediaType.parse("application/json"), jsonObject.toString());

                return new Response.Builder().body(body)
                        .message("Socket time out exception")
                        .request(request)
                        .build();
            } catch (JSONException ex) {
                DebugLog.print(ex);
            }
        } catch (Exception e) {
            Utils.hideProgressBar();
            DebugLog.print(e);
        }

        return response;
    };

现在,我担心的是,当我将上述代码用于“套接字超时异常”时,它给了我类似以下的异常:

java.lang.IllegalStateException: protocol == null

所以,任何人都可以帮助我如何在拦截器中创建自定义响应。

1 个答案:

答案 0 :(得分:0)

这意味着您没有为protocol对象的Response属性设置任何值。

您可以通过以下方式做到这一点:

return new Response.Builder()
    ...
    .protocol(Protocol.HTTP_1_1) // Or any other value that's suitable for your use case
    .build();

您可以检查Protocol Javadoc来查看其他允许的值