33

I post a JsonRequest to a server. The server is slow and Volley tends to make multiple calls to the slow server because it didn't get a response from the first request (since my server is slow). Is there a way to prevent Volley from retrying a request so that it can receive the first response?

I have tried:

myRequest.setRetryPolicy(new DefaultRetryPolicy(
                TIMEOUT_MS, 
                RETRIES, 
                BACKOFF_MULT)); 

I have replaced TIMEOUT_MS with 0, RETRIES with 0, and also BACKOFF_MULT with 0, but it didn't work.

Any suggestions?

HF_
  • 689
  • 3
  • 9
  • 22
xiaowoo
  • 2,248
  • 7
  • 34
  • 45

4 Answers4

50

The Volley Default Retry Policy is:

/** The default socket timeout in milliseconds */
public static final int DEFAULT_TIMEOUT_MS = 2500;

/** The default number of retries */
public static final int DEFAULT_MAX_RETRIES = 1;

/** The default backoff multiplier */
public static final float DEFAULT_BACKOFF_MULT = 1f;

You can find it in DefaultRetryPolicy.java,

so you can see that volley makes 1 retry request by default.

Try to use smaller TIMEOUT (if you don't want to wait the 2500ms), or bigger than 2500ms to get the answer), but keep the other values, for example:

// Wait 20 seconds and don't retry more than once
myRequest.setRetryPolicy(new DefaultRetryPolicy(
       (int) TimeUnit.SECONDS.toMillis(20),
       DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
       DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

Hence, to disable Volley from retrying you will need to do:

myRequest.setRetryPolicy(new DefaultRetryPolicy(
       (int) TimeUnit.SECONDS.toMillis(20), //After the set time elapses the request will timeout
       0,
       DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Nabster
  • 1,187
  • 2
  • 10
  • 27
David
  • 37,109
  • 32
  • 120
  • 141
  • 2
    How do I make DEFAULT_MAX_RETRIES = 0 for all requests? any possibilities? – Bala Vishnu Aug 26 '15 at 09:49
  • 1
    @BalaVishnu You don't have to change the default value. All you have to do is to use my code above, and set the second parameter to 0. – David Aug 26 '15 at 09:51
  • Oh K..Thank you, but was wondering if any global setting can be made for this so that we need not give this line again and again in all requests. – Bala Vishnu Aug 26 '15 at 09:53
  • 1
    @BalaVishnu Ha, so open the `DefaultRetryPolicy` volley class and change the `DEFAULT_MAX_RETRIES` to 0 (the default is 1) – David Aug 26 '15 at 10:00
  • 1
    myRequest.setRetryPolicy(new DefaultRetryPolicy( 2500, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); won't retry at all ? – Mahendran Feb 18 '16 at 11:27
  • @BalaVishnu you can also create a class extending JsonObjectRequest, call setRetryPolicy passing the values you want in its constructor, and use it everywhere instead of JsonObjectRequest. – Mateus Gondim May 11 '17 at 18:44
5

Try this,

// remove caching
        jsObjRequest.setShouldCache(false);
        // Wait 30 seconds and don't retry more than once
        jsObjRequest.setRetryPolicy(new DefaultRetryPolicy(0, 0,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

Method call form task

public void callWebService(JSONObject jsonRequest) {

    JsonObjectRequest jsObjRequest = new JsonObjectRequest(
            Request.Method.POST, url + pageurl, jsonRequest,
            new Response.Listener<JSONObject>() {

                @Override
                public void onResponse(JSONObject jsonObject) {
                    sendResponse(jsonObject);

                }
            }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {

                    callBack.onError(error);
                    try {
                        if (progressDialog != null) {
                            progressDialog.dismiss();
                            progressDialog = null;
                        }
                    } catch (Exception e) {
                        Helper.customPrintStackTrace(e);
                    }

                }
            }

    ) {

        @Override
        public String getBodyContentType() {
            return "application/json; charset=utf-8";
        }

        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {

            Map<String, String> params = new HashMap<String, String>();

            params.put(WebConfig.WebParams.APIKEY, Helper
                    .getStringValuefromPrefs(context,
                            SharedPreferencesKey.PREF_APIKEY));
            params.put(WebConfig.WebParams.APITOKEN, Helper
                    .getStringValuefromPrefs(context,
                            SharedPreferencesKey.PREF_APITOKEN));

            if (!Helper.getStringValuefromPrefs(context,
                    SharedPreferencesKey.PREF_USERID).equals("")) {

                params.put(WebConfig.WebParams.USER_ID, Helper
                        .getStringValuefromPrefs(context,
                                SharedPreferencesKey.PREF_USERID));

            } else {
                params.put(WebConfig.WebParams.USER_ID, "0");
            }

            return params;
        }

    };

    // remove caching
    jsObjRequest.setShouldCache(false);
    // Wait 30 seconds and don't retry more than once
    jsObjRequest.setRetryPolicy(new DefaultRetryPolicy(0, 0,
            DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    // Access the RequestQueue through your singleton class.
    VolleySingleton.getInstance(context).addToRequestQueue(jsObjRequest);

    if (showDefultProcess) {

        progressDialog.show();
    }

}
Ashish Dwivedi
  • 8,048
  • 5
  • 58
  • 78
4

To stop Volley from retrying a request, simply set the retry policy of the request to a DefaultRetryPolicy with maxNumRetries being 0:

myRequest.setRetryPolicy(new DefaultRetryPolicy(
    DefaultRetryPolicy.DEFAULT_TIMEOUT_MS,
    0,  // maxNumRetries = 0 means no retry
    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Pang
  • 9,564
  • 146
  • 81
  • 122
1

Using your StringRequest Object or JsonObjectRequest Object or JsonArrayRequest Object call this method.

For example if the object is an instance of StringRequest, here is the method:

stringRequest.setRetryPolicy(new DefaultRetryPolicy(initialTimeoutMs, maxNumRetries,
               backoffMultiplier ));

initialTimeoutMs The initial timeout for the policy.

maxNumRetries The maximum number of retries.

backoffMultiplier Backoff multiplier for the policy.

Below are the parameters which I gave.

stringRequest.setRetryPolicy(new DefaultRetryPolicy(10 * 1000, 0,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

First parameter says set InitialTimeout to 10 seconds.

Second parameter says set retry count tries to 0.

Third parameter is default.

Alireza Noorali
  • 3,129
  • 2
  • 33
  • 80
mehmoodnisar125
  • 1,469
  • 18
  • 14