web-dev-qa-db-fra.com

Comment désactiver la demande Volley de réessayer?

Je poste un JsonRequest sur un serveur. Le serveur est lent. Volley a tendance à faire plusieurs appels au serveur lent car il n'a pas reçu de réponse à la première demande (car mon serveur est lent). Existe-t-il un moyen d'empêcher Volley de réessayer une demande afin qu'il puisse recevoir la première réponse?

J'ai essayé:

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

J'ai remplacé TIMEOUT_MS = 0, RETRIES = 0 et même BACKOFF_MULT = 0, mais cela ne fonctionne pas.

D'autres suggestions?

23
xiaowoo

La stratégie de nouvelle tentative Volley par défaut est la suivante:

/** 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;

Vous pouvez le trouver dans DefaultRetryPolicy.Java, 

vous pouvez donc voir que volley fait une demande de nouvelle tentative par défaut.

Essayez d’utiliser TIMEOUT plus petit (si vous ne voulez pas attendre les 2500 ms) ou plus grand que 2500 ms pour obtenir la réponse), mais conservez les autres valeurs, par exemple:

// 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));
39
David

Essaye ça, 

// 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));

Formulaire d'appel de méthode

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();
    }

}
5
Dwivedi Ji

Pour empêcher Volley de reprendre une demande, définissez simplement la stratégie de nouvelle tentative de la demande sur DefaultRetryPolicy avec maxNumRetries étant 0:

myRequest.setRetryPolicy(new DefaultRetryPolicy(
    DefaultRetryPolicy.DEFAULT_TIMEOUT_MS,
    0,  // maxNumRetries = 0 means no retry
    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
4
Pang

Avec votre StringRequest Object ou JsonObjectRequest Object ou JsonArrayRequest Object, appelez cette méthode.

Par exemple, si l'objet est une instance de StringRequest, voici la méthode:

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

initialTimeoutMs Le délai d'attente initial pour la stratégie.

maxNumRetries Le nombre maximal de tentatives.

backoffMultiplier Multiplicateur de backoff pour la stratégie.

Ci-dessous sont les paramètres que j'ai donnés. 

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

Le premier paramètre indique de définir InitialTimeout à 10 secondes.

Le deuxième paramètre indique que le nombre de tentatives d’essai est de 0.

Le troisième paramètre est la valeur par défaut.

0
mehmoodnisar125