198 votes

Android Volley Timeout

J'utilise le nouveau cadre volley pour Android pour faire une demande à mon serveur. Mais il y a un délai d'attente avant d'obtenir la réponse, bien qu'il y ait une réponse.

Existe-t-il un moyen de modifier le délai d'attente en une valeur longue ?

Edit :

J'ai essayé de régler les deux

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

dans la classe HttpClientStack du Volley Framework à un autre nombre entier (50000), mais le délai d'attente est toujours de 50 secondes.

Il doit donc y avoir un autre moyen.

Merci beaucoup.

0 votes

24 votes

@AdamStelmaszczyk - Il ne s'agit pas d'un doublon car il s'agit de détails spécifiques au cadre Volley. La question de l'OS référencée concerne l'utilisation de la balise HttpClient classe.

375voto

larham1 Points 2088

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

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

0 votes

Savez-vous également comment définir la priorité d'une demande ?

2 votes

@Markus override Request.getPriority() pour retourner autre chose que 'normal'. ImageRequest le fait. NOTE : vous devriez poser cette question dans une question SO séparée.

1 votes

C'est exactement ce que je cherchais pour éviter que Volley ne rejette ma demande qui prend 15 secondes. - Merci !

236voto

Yakiv Mospan Points 1291

Pour gérer le Timeout de Android Volley, vous devez utiliser Politique de réessai

Politique de réessai

  • Volley offre un moyen simple d'implémenter votre RetryPolicy pour vos demandes.
  • Volley fixe le délai par défaut de Socket & ConnectionTImeout à 5 secondes pour toutes les demandes.

RetryPolicy est une interface dans laquelle vous devez implémenter votre logique sur la façon dont vous voulez réessayer une demande particulière lorsqu'un dépassement de délai se produit.

Elle porte sur les trois paramètres suivants

  • Timeout - Spécifie le délai d'attente du socket en millisecondes pour chaque tentative de réessai.
  • Number Of Retries - Nombre de tentatives de réessai.
  • Back Off Multiplier - Un multiplicateur qui est utilisé pour déterminer le temps exponentiel fixé au socket pour chaque tentative de réessai.

Par ex. Si RetryPolicy est créé avec les valeurs suivantes

Délai d'attente - 3000 secondes, Nombre de tentatives - 2, Multiplicateur de recul - 2

Tentative 1 :

  • temps = temps + (temps * Multiplicateur d'arrêt) ;
  • temps = 3000 + 6000 = 9000
  • Socket Timeout = time ;
  • La demande a été envoyée avec un délai d'attente de 9 secondes.

Tentative 2 :

  • temps = temps + (temps * Multiplicateur de Back Off) ;
  • temps = 9000 + 18000 = 27000
  • Socket Timeout = time ;
  • La demande a été envoyée avec un délai d'attente de 27 secondes.

Donc à la fin de Tentative 2 Si le délai d'attente de la connexion se prolonge, Volley envoie un TimeoutError dans le gestionnaire de réponse d'erreur de l'interface utilisateur.

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

0 votes

Merci pour une réponse détaillée sur ce que le RetryPolicy fait réellement.

5 votes

Mais dans votre exemple, le temps de la première tentative est de 0 + (3000 * 2) au lieu de 3000 + (3000 * 2). Et le deuxième 6000 + (3000 * 2).

0 votes

13KZ, je crois que vous vous trompez encore dans le calcul du temps, voyez mon édition et vérifiez avec la source de la volée.

23voto

Exception Al Points 3432

Juste pour contribuer à mon approche. Comme déjà répondu, RetryPolicy est la voie à suivre. Mais si vous avez besoin d'une politique différente de celle par défaut pour toutes vos demandes, vous pouvez la définir dans une classe de demande de base, de sorte que vous n'avez pas besoin de définir la politique pour toutes les instances de vos demandes.

Quelque chose comme ça :

public class BaseRequest<T> extends Request<T> {

    public BaseRequest(int method, String url, Response.ErrorListener listener) {
        super(method, url, listener);
        setRetryPolicy(getMyOwnDefaultRetryPolicy());
    }
}

Dans mon cas, j'ai un GsonRequest qui s'étend à partir de ce BaseRequest, de sorte que je ne cours pas le risque d'oublier de définir la politique pour une demande spécifique et vous pouvez toujours la remplacer si une demande spécifique l'exige.

1 votes

Cela devrait fonctionner, non ? setRetryPolicy(new DefaultRetryPolicy( 1000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)) ;

2voto

Bao Le Points 1468

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

Par défaut, Volley définit le délai d'attente de manière égale pour setConnectionTimeout() et setReadTimeout() avec la valeur de RetryPolicy. Dans mon cas, Volley lève une exception de délai d'attente 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 politique setReadTimeout(). Puis de l'utiliser lors de la création de RequestQueue comme suit

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

1voto

Cissmayazz Points 187

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

Puis j'ai ajouté un setCurrentTimeout(int timeout) dans la classe Request et je l'ai appelé .

Cela semble faire l'affaire.

Désolé pour ma paresse, et vive l'open source !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X