【问题标题】:How to show error message if not getting response from server?如果没有得到服务器的响应,如何显示错误消息?
【发布时间】:2017-05-27 07:38:31
【问题描述】:

我正在列表视图中填充医生列表,并且它工作正常。现在我想要的是,如果在 30 秒内没有从服务器获得响应,我想打开警报。我如何在下面的代码中使用 volley 来做到这一点。我已经检查了互联网连接,但我也想检查响应。我怎样才能做到这一点?

public void getDoctorlist(final String email, final String sessionid) {

        String tag_string_req = "req_service";

        pDialog.setMessage("Getting Details");
        showDialog();

        StringRequest strReq = new StringRequest(Method.POST, AppConfig.URL_Doc_list, new Response.Listener<String>() {

            @Override
            public void onResponse(String inventoryList) {
                Log.d("++++++", inventoryList.toString());
                hideDialog();
                try {
                    JSONObject jObj = new JSONObject(inventoryList);

                    String Errorcode = jObj.getString("responseCode");
                    if (Errorcode.equalsIgnoreCase("101")) {
                        Toast.makeText(getApplicationContext(), "Please Try again later", Toast.LENGTH_SHORT).show();

                    }

                    if (Errorcode.equalsIgnoreCase("102")) {

                        JSONArray json_user = jObj.getJSONArray("dataList");

                        for (int i = 0; i < json_user.length(); i++) {
                            try {

                                JSONObject obj = json_user.getJSONObject(i);

                                GetSetPaln doctor = new GetSetPaln(obj.getString("companyName"), obj.getString("clientId"),
                                        obj.getString("clientIdentifier"), obj.getString("lastVisit"),
                                        obj.getString("imageUrl"), obj.getString("emailId"), obj.getString("contactNo"),
                                        obj.getString("address"), obj.getString("clientLocationId"),
                                        obj.getString("city"));

                                doc_list.add(doctor);

                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                        ad_doctor = new DoctorAdapter(DoctorList.this, doc_list);
                        listview.setAdapter(ad_doctor);
                    }

                } catch (JSONException e) {
                    e.printStackTrace();
                }

            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {

                hideDialog();
            }
        }) {

            @Override
            protected Map<String, String> getParams() {
                Map<String, String> params = new HashMap<String, String>();

                params.put("emailId", email);
                params.put("sessionId", sessionid);
                return params;

            }

        };
        AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
    }

【问题讨论】:

  • 处理onErrorResponse 中的错误。

标签: android web-services android-volley


【解决方案1】:
   gson_request.setRetryPolicy((new DefaultRetryPolicy(
            20000,
            DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
            DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)));

   you can handle timeout error OnErrorResponse:

     public class GsonRequest<T> extends Request<T> 
     {
      private final Gson gson = new Gson();
      private final Class<T> clazz;
      private final Response.Listener<T> listener;
      private String parameters = null;
      private VolleyErrorHandling volleyErrorHandling=new VolleyErrorHandling();

      public GsonRequest(int post, String url, Class<T> clazz, String params, Response.Listener<T> listener, Response.ErrorListener errorListener) {
    super(post, url, errorListener);
    this.clazz = clazz;
    this.listener = listener;

    this.parameters = params;
}

@Override
protected Response<T> parseNetworkResponse(NetworkResponse networkResponse) {
    try {
        String json = new String(
                networkResponse.data,
                HttpHeaderParser.parseCharset(networkResponse.headers));
        return Response.success(
                gson.fromJson(json, clazz),
                HttpHeaderParser.parseCacheHeaders(networkResponse));
    } catch (UnsupportedEncodingException e) {
        return Response.error(new ParseError(e));
    } catch (JsonSyntaxException e) {
        return Response.error(new ParseError(e));
    }
}

@Override
protected void deliverResponse(T t) {

    listener.onResponse(t);
}


@Override
public String getBodyContentType() {
    return "application/json";
}

@Override
public byte[] getBody() throws AuthFailureError {

    return parameters.toString().getBytes();
}

@Override
protected VolleyError parseNetworkError(VolleyError volleyError) {

    NetworkResponse response = volleyError.networkResponse;
    VolleyError error = null;
    String strerrormsg = "";

    if (response != null && response.data != null)
    {
        switch (response.statusCode)
        {
            case 400:
                if (volleyError instanceof ServerError)
                {
                volleyError = new VolleyError(new String(volleyError.networkResponse.data));
                    if (volleyErrorHandling.is_empty(volleyError.getLocalizedMessage())) {

                        strerrormsg = "SERVER_ERROR";
                        error = new VolleyError(strerrormsg);
                        volleyError = error;
                    }
                } else {
                    strerrormsg = "SERVER_ERROR";
                    error = new VolleyError(strerrormsg);
                    volleyError = error;
                }
                break;
            case 401:
                strerrormsg = "Bad Request";
                error = new VolleyError(strerrormsg);
                volleyError = error;
                break;
            case 403:
                strerrormsg = "Unauthorized request to server";
                error = new VolleyError(strerrormsg);
                volleyError = error;
                break;
            case 404:
                strerrormsg = "Something went wrong. Please try again later.";
                error = new VolleyError(strerrormsg);
                volleyError = error;
                break;

            case 408:
                strerrormsg = "Something went wrong. Please try again later.";
                error = new VolleyError(strerrormsg);
                volleyError = error;
                break;

            case 500:
                strerrormsg = "Oops something went wrong. Please try again later.";
                error = new VolleyError(strerrormsg);
                volleyError = error;
                break;
            case 503:
                strerrormsg = "Oops something went wrong. Please try again later.";
                error = new VolleyError(strerrormsg);
                volleyError = error;
                break;
            default:
                strerrormsg = "Oops something went wrong. Please try again later.";
                error = new VolleyError(strerrormsg);
                volleyError = error;
                break;
        }
    }
    else if (response == null)
    {
        if (volleyError.getClass().equals(TimeoutError.class)) {
            strerrormsg = "Oops. Network connection timed out";
            error = new VolleyError(strerrormsg);
            volleyError = error;
        }
    }
    return volleyError;
  }
  }

【讨论】:

    【解决方案2】:

    您可以在RetryPolicy设置超时

    strReq.setRetryPolicy(new DefaultRetryPolicy(
        30000, //for 30 Seconds
        DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
        DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    

    然后检查您的onErrorResponse()

    new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
             hideDialog();
        }
    }
    

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      这已经被问过了。 阅读此处Change Volley timeout duration 如何为 Volley 请求设置固定超时。

      之后,您应该使用onErrorResponse 相应地监听错误和超时

      【讨论】:

      • 如果已经被问到为什么要发布答案。您可以通过评论告诉他它与其他帖子的重复。
      • 因为 cmets 经常被忽视,尽管现在我们有 4 个答案,复制粘贴的代码与我链接的答案几乎相同......我确实犯了一个错误,试图阻止这种情况发生...
      【解决方案4】:

      通过VolleyRetryPolicy可以实现30秒超时。

      strReq.setRetryPolicy(new DefaultRetryPolicy(
          MY_SOCKET_TIMEOUT_MS, 
          DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
          DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
      

      在此显示错误消息。

      new Response.ErrorListener() {
      
              @Override
              public void onErrorResponse(VolleyError error) {
                  // Show dialog to show the error message from the server.
              }
      }
      

      希望对您有所帮助。快乐编码。

      【讨论】:

        【解决方案5】:
        private void getResponce() {
        
            RequestQueue requestQueue = Volley.newRequestQueue(this);
        
            JsonObjectRequest jsObjRequest = new JsonObjectRequest
                    (Request.Method.GET, _url, null, new Response.Listener<JSONObject>() {
                        @Override
                        public void onResponse(JSONObject response) {
        
                        }
                    }, new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
        
                        }
                    });
            int socketTimeout = 30000; // 30 seconds. You can change it
            RetryPolicy policy = new DefaultRetryPolicy(socketTimeout,
                    DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
            jsObjRequest.setRetryPolicy(policy);
            requestQueue.add(jsObjRequest);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-05-08
          • 1970-01-01
          • 2017-03-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-02
          相关资源
          最近更新 更多