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