Modifier la durée du délai de volley

J’utilise le nouveau framework Volley pour Android pour faire une demande à mon serveur. Mais cela prend du temps avant d’obtenir la réponse, même si cela répond.

J’ai essayé d’append ce code:

HttpConnectionParams.setConnectionTimeout(httpParams, 5000); HttpConnectionParams.setSoTimeout(httpParams, timeoutMs); 

dans HttpClientStack du framework Volley à un nombre entier différent (50000), mais il HttpClientStack encore avant 50 secondes.

Y a-t-il un moyen de changer le délai d’expiration à une valeur longue?

Voir Request.setRetryPolicy() et le constructeur de DefaultRetryPolicy , par exemple

 JsonObjectRequest myRequest = new JsonObjectRequest(Method.GET, url, null, new Response.Listener() { @Override public void onResponse(JSONObject response) { Log.d(TAG, response.toSsortingng()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.d(TAG, "Error: " + error.getMessage()); } }); myRequest.setRetryPolicy(new DefaultRetryPolicy( MY_SOCKET_TIMEOUT_MS, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 

Pour gérer Android Volley Timeout, vous devez utiliser RetryPolicy

RetryPolicy

  • Volley fournit un moyen simple d’implémenter votre RetryPolicy pour vos demandes.
  • Volley définit le paramètre Socket & ConnectionTImeout par défaut sur 5 secondes pour toutes les requêtes.

RetryPolicy est une interface où vous devez implémenter votre logique sur la manière dont vous souhaitez réessayer une requête particulière en cas de dépassement de délai.

Il traite de ces trois parameters

  • Timeout – Spécifie le délai d’expiration du socket en millis par tentative de nouvelle tentative.
  • Number of Resortinges – Nombre de tentatives d’une nouvelle tentative.
  • Back Off Multiplier – Multiplicateur utilisé pour déterminer le temps exponentiel défini sur socket pour chaque tentative de nouvelle tentative.

Pour ex. Si RetryPolicy est créé avec ces valeurs

Timeout – 3000 ms, nombre de tentatives de tentatives – 2, multiplicateur de désactivation – 2.0

Réessayer la tentative 1:

  • time = time + (heure * Multiplicateur Back Off);
  • temps = 3000 + 6000 = 9000ms
  • Socket Timeout = time;
  • Demande envoyée avec un délai d’attente de 9 secondes

Réessayer la tentative 2:

  • time = time + (heure * Multiplicateur Back Off);
  • temps = 9000 + 18000 = 27000ms
  • Socket Timeout = time;
  • Demande envoyée avec un délai d’attente de 27 secondes

Donc, à la fin de Retry Attempt 2, si Socket Timeout se produit toujours, Volley lance un TimeoutError dans votre gestionnaire de réponse d’erreur UI.

 //Set a retry policy in case of SocketTimeout & ConnectionTimeout Exceptions. //Volley does retry for you if you have specified the policy. jsonObjRequest.setRetryPolicy(new DefaultRetryPolicy(5000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 

Juste pour consortingbuer à mon approche. Comme déjà répondu, RetryPolicy est la voie à suivre. Mais si vous avez besoin d’une stratégie différente de la valeur par défaut pour toutes vos demandes, vous pouvez la définir dans une classe de base, vous n’avez donc pas besoin de définir la stratégie pour toutes les instances de vos demandes.

Quelque chose comme ça:

 public class BaseRequest extends Request { public BaseRequest(int method, Ssortingng url, Response.ErrorListener listener) { super(method, url, listener); setRetryPolicy(getMyOwnDefaultRetryPolicy()); } } 

Dans mon cas, j’ai un GsonRequest qui s’étend à partir de cette BaseRequest, donc je ne risque pas d’oublier de définir la stratégie pour une requête spécifique et vous pouvez toujours la remplacer si une requête spécifique l’exige.

 /** * @param request * @param  */ public  void addToRequestQueue(Request request) { request.setRetryPolicy(new DefaultRetryPolicy( MY_SOCKET_TIMEOUT_MS, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); getRequestQueue().add(request); } 
 req.setRetryPolicy(new DefaultRetryPolicy( MY_SOCKET_TIMEOUT_MS, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 

Vous pouvez définir MY_SOCKET_TIMEOUT_MS sur 100. Tout ce que vous voulez définir est en millisecondes. DEFAULT_MAX_RETRIES peut être 0 par défaut est 1.

 int MY_SOCKET_TIMEOUT_MS=500; ssortingngRequest.setRetryPolicy(new DefaultRetryPolicy( MY_SOCKET_TIMEOUT_MS, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 

Solution alternative si toutes les solutions ci-dessus ne fonctionnent pas pour vous

Par défaut, Volley définit le délai d’expiration de manière égale pour setConnectionTimeout() et setReadTimeout() avec la valeur de RetryPolicy . Dans mon cas, Volley lance une exception de délai d’expiration pour les gros volumes de données, voir:

 com.android.volley.toolbox.HurlStack.openConnection(). 

Ma solution est de créer une classe qui étend HttpStack avec ma propre setReadTimeout() . Ensuite, utilisez-le quand crée RequestQueue comme suit:

 Volley.newRequestQueue(mContext.getApplicationContext(), new MyHurlStack()) 

Une autre façon de le faire est d’utiliser JsonObjectRequest personnalisé en:

 @Override public RetryPolicy getRetryPolicy() { // here you can write a custom retry policy and return it return super.getRetryPolicy(); } 

Source: Exemple Android Volley

J’ai fini par append une méthode setCurrentTimeout(int timeout) à RetryPolicy et à son implémentation dans DefaultRetryPolicy .

Ensuite, j’ai ajouté un setCurrentTimeout(int timeout) dans la classe Request et l’ai appelé.

Cela semble faire le travail.

Désolé pour ma paresse au passage et houra pour open source.