0

I am populating doctor list in listview and its working fine.Now what I want that I want to open alert if not getting response from server in 30 sec. How can I do that using volley in below code. I have already check internet connectivity, but I want to check response also. How can I achieve this ?

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);
    }
Noreen Khan
  • 233
  • 3
  • 14

5 Answers5

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;
  }
  }
saiRam89
  • 365
  • 1
  • 8
  • 21
0

This has been already asked. Read here Change Volley timeout duration how set a fixed timeout for Volley requests.

After that you should use onErrorResponse to listen for errors and timeouts accordingly

Community
  • 1
  • 1
MatPag
  • 41,742
  • 14
  • 105
  • 114
  • If already has been asked than why should post an answer. you can tell him by comment that its duplicate of other post. – Akash Patel Jan 12 '17 at 09:20
  • because comments often pass unnoticed, and despite everything now we have 4 answers with copy-pasted pretty much the same code of the answer i linked... i did a mistake for sure trying preventing this to happen... – MatPag Jan 12 '17 at 09:45
0

Through the Volley RetryPolicy you can achieve 30 seconds time out.

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

In this show the error message.

new Response.ErrorListener() {

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

Hope this help. Happy Coding.

Jaymin Panchal
  • 2,797
  • 2
  • 27
  • 31
Sagar Gangawane
  • 1,985
  • 1
  • 12
  • 22
0

You can set timeout in RetryPolicy

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

and then check your onErrorResponse()

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

Hope it helps you.

Jaymin Panchal
  • 2,797
  • 2
  • 27
  • 31
0
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);
}
Meraj Ali
  • 11
  • 2