【问题标题】:com.android.volley.NoConnectionError: java.net.ProtocolException: Unexpected status line: <!DOCTYPE html>com.android.volley.NoConnectionError:java.net.ProtocolException:意外状态行:<!DOCTYPE html>
【发布时间】:2016-11-13 00:56:55
【问题描述】:

我正在使用 volley 库来获取响应,大多数情况下它在某些情况下工作正常我收到上述错误,当我尝试检查浏览器时它工作正常。请提出解决此问题的建议。我正在尝试删除缓存并进行检查,即使问题仍然存在,但我不明白我在哪里做错了。

我收到以下错误

ava.lang.NullPointerException: Attempt to read from field 'byte[] com.android.volley.NetworkResponse.data' on a null object reference
                                                  at com.pcnc.bop.helpers.VolleyRequest$2.onErrorResponse(VolleyRequest.java:98)
                                                  at com.android.volley.Request.deliverError(Request.java:577)
                                                  at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:101)
                                                  at android.os.Handler.handleCallback(Handler.java:739)
                                                  at android.os.Handler.dispatchMessage(Handler.java:95)
                                                  at android.os.Looper.loop(Looper.java:135)
                                                  at android.app.ActivityThread.main(ActivityThread.java:5343)
                                                  at java.lang.reflect.Method.invoke(Native Method)
                                                  at java.lang.reflect.Method.invoke(Method.java:372)
                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)

这是我的 volley-request sn-p

  public void requestString(final String requestName,
                              final String webserviceUrl,
                              final Map<Object, Object> requestParams, final int webMethod,
                              final boolean getCache) {
        LogUtils.i("Sending Request", webserviceUrl);
        StringRequest stringRequest = new StringRequest(webMethod,
                webserviceUrl, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                LogUtils.i("Response", response);
                mRequestCompletedListener.onRequestCompleted(
                        requestName, true, response, null);
            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {

                String errorResponse = null;

                if (getCache) {
                    final Cache cache = AppController.getInstance()
                            .getRequestQueue().getCache();
                    final Entry entry = cache.get(webserviceUrl);
                    if (entry.data != null) {
                        try {
                            errorResponse = new String(entry.data, "UTF-8");
                            mRequestCompletedListener
                                    .onRequestCompleted(requestName,
                                            true, errorResponse, null);
                            return;
                        } catch (UnsupportedEncodingException e) {
                            LogUtils.e(TAG, e);
                        }
                    } else {
                        LogUtils.e(TAG, requestName
                                + " Cache does not exist");
                    }
                }
                try {
                    VolleyError responseError = new VolleyError(
                            new String(error.networkResponse.data));
                    LogUtils.i("ErrorResponse", responseError.getMessage());
                    try {
                        if (responseError != null) {
                            final JSONObject responseJson = new JSONObject(responseError.getMessage());
                            // Show Alert Information
                            errorResponse = responseJson.getString(AppConstants.MESSAGE);
                        }
                    } catch (Exception e) {
                        errorResponse = "Unknown";
                    }
                } catch (Exception e) {
                    LogUtils.e(TAG, e);
                }
                mRequestCompletedListener.onRequestCompleted(
                        requestName, false, null,
                        errorResponse);
            }
        }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                @SuppressWarnings("unchecked")
                final Map<String, String> params = (HashMap<String, String>) requestParams
                        .get(VolleyRequestConstants.HTTP_PARAMS);
                if (params != null) {
                    return params;
                }
                return super.getParams();
            }

            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                @SuppressWarnings("unchecked")
                final Map<String, String> headers = (HashMap<String, String>) requestParams
                        .get(VolleyRequestConstants.HTTP_HEADERS);
                if (headers != null) {
                    return headers;
                }
                return super.getHeaders();
            }

            @Override
            public com.android.volley.Request.Priority getPriority() {
                final Priority priority = (com.android.volley.Request.Priority) requestParams
                        .get(VolleyRequestConstants.HTTP_PRIORITY);
                if (priority != null) {
                    return priority;
                }
                return super.getPriority();
            }

            @Override
            public String getBodyContentType() {
                final String contentType = (String) requestParams
                        .get(VolleyRequestConstants.HTTP_CONTENT_TYPE);
                if (contentType != null) {
                    return contentType;
                }
                return super.getBodyContentType();
            }

            @Override
            public byte[] getBody() throws AuthFailureError {
                final byte[] body = (byte[]) requestParams
                        .get(VolleyRequestConstants.HTTP_BODY_CONTENT);
                if (body != null) {
                    return body;
                }
                return super.getBody();
            }
        };

    /*    DefaultRetryPolicy retryPolicy = new DefaultRetryPolicy(0, -1, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
        stringRequest.setRetryPolicy(retryPolicy);*/
        stringRequest.setTag(requestName);
        // Adding String request to request queue
        AppController.getInstance().addToRequestQueue(stringRequest);
    }

【问题讨论】:

  • 您可能在Manifest.xml.. 中缺少 INTERNET 权限!!
  • 没有权限,我已经正确提到了。在极少数情况下会出现此问题。
  • 那可能是网速慢的时候出问题了..!!
  • 不是在那种情况下,实际上对于某些请求有响应,而对于某些请求没有。如果我点击没有响应的服务器,如果我再次点击有响应的服务器。在这种情况下出现上述错误。
  • 然后连接你的 API 管理器..!!

标签: android android-volley


【解决方案1】:

这样的行:

@Override
public void onErrorResponse(VolleyError error) {
  //...
  VolleyError responseError = new VolleyError( new String(error.networkResponse.data));
  //..
}

导致您面临的错误,因为error.networkResponse 可以变成null。所以添加空检查或额外的catch 块或类似

【讨论】:

  • 你的意思是它之前没有抛出异常?
  • 这就是生活。并非每个服务器响应都包含正文,因此error.networkResponse 可以是null,您应该注意这一点
  • 检查响应是否可以为空?我已经说过了!您期望得到什么样的指导?
  • 我已经尝试过了,但我没有得到解决方案。仍然遇到同样的异常。
  • 那么你有另一个类似的行,它也应该是空安全的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多