web-dev-qa-db-fra.com

Changer la durée du temps mort

J'utilise le nouveau framework Volley pour que Android fasse une demande à mon serveur. Mais il arrive à expiration avant d’obtenir la réponse, bien qu’il réponde.

J'ai essayé d'ajouter ce code:

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

dans HttpClientStack du cadre Volley vers un entier différent (50000), mais il expire toujours avant 50 secondes.

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

180
Cissmayazz

Voir Request.setRetryPolicy() et le constructeur pour DefaultRetryPolicy, par ex.

JsonObjectRequest myRequest = new JsonObjectRequest(Method.GET,
        url, null,
        new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {
                Log.d(TAG, response.toString());
            }
        }, 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));
344
larham1

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

RetryPolicy

  • Volley offre un moyen simple de mettre en œuvre votre stratégie de réanimation pour vos demandes.
  • Volley définit Socket & ConnectionTImeout par défaut sur 5 secondes pour toutes les demandes.

RetryPolicy est une interface dans laquelle vous devez implémenter votre logique, qui vous permet de réessayer une demande particulière lorsqu'un délai d'expiration survient.

Il traite de ces trois paramètres

  • Délai d'attente - Spécifie le délai d'attente du socket en millisecondes à chaque nouvelle tentative.
  • Nombre de tentatives - Nombre de tentatives de tentatives.
  • Back Off Multiplier - Un multiplicateur utilisé pour déterminer le temps exponentiel défini sur le socket pour chaque nouvelle tentative.

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

Délai d'attente - 3 000 ms, Nombre de nouvelles tentatives - 2, Multiplicateur de désactivation - 2.0

Nouvelle tentative 1:

  • heure = heure + (heure * Back Off Multiplier);
  • temps = 3000 + 6000 = 9000ms
  • Socket Timeout = time;
  • Requête envoyée avec un délai d'expiration de la prise de 9 secondes

Nouvelle tentative 2:

  • heure = heure + (heure * Back Off Multiplier);
  • temps = 9000 + 18000 = 27000ms
  • Socket Timeout = time;
  • Demande envoyée avec un délai d'expiration de 27 secondes pour la prise

Donc, à la fin de Réessayer 2 si le délai d'attente de socket est toujours écoulé, Volley lancera un TimeoutError dans votre gestionnaire de réponse d'erreur d'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));
215
Yakiv Mospan

Juste pour contribuer avec mon approche. Comme déjà répondu, RetryPolicy est la voie à suivre. Toutefois, si vous avez besoin d'une stratégie différente de celle par défaut pour toutes vos demandes, vous pouvez la définir dans une classe Request 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<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 de ce BaseRequest, donc je ne risque pas d'oublier de définir la politique pour une requête spécifique et vous pouvez toujours la remplacer si une requête spécifique l'exige.

22
Androiderson
/**
 * @param request
 * @param <T>
 */
public <T> void addToRequestQueue(Request<T> request) {

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

    getRequestQueue().add(request);
}
11
chavanNil
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 souhaitez définir est en millisecondes. DEFAULT_MAX_RETRIES peut être 0, par défaut, 1.

7
Manasvi
int MY_SOCKET_TIMEOUT_MS=500;

 stringRequest.setRetryPolicy(new DefaultRetryPolicy(
                MY_SOCKET_TIMEOUT_MS,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
3
Avinash

Une autre façon de le faire est de personnaliser JsonObjectRequest par:

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

Source: Exemple de Volley Android

2
KnowIT

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

Par défaut, Volley règle le timeout 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'expiration pour les gros morceaux 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 utilisez-le quand crée RequestQueue comme suit:

Volley.newRequestQueue(mContext.getApplicationContext(), new MyHurlStack())
2
Bao Le

J'ai fini par ajouter une méthode setCurrentTimeout(int timeout) à la RetryPolicy et à sa mise en œuvre dans DefaultRetryPolicy.

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

Cela semble faire le travail.

Désolé pour ma paresse au fait et bravo pour l'open source.

1
Cissmayazz