J'utilise le nouveau framework Volley pour Android pour faire une requête à mon serveur. Mais il expire 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
le framework Volley à un entier différent (50000), mais il expire toujours avant 50 secondes.
Existe-t-il un moyen de modifier le délai d'expiration en une valeur longue?
android
timeout
android-volley
Cissmayazz
la source
la source
HttpClient
classe.Réponses:
Voir
Request.setRetryPolicy()
et le constructeur pourDefaultRetryPolicy
, par exempleJsonObjectRequest 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));
la source
Pour gérer Android Volley Timeout, vous devez utiliser
RetryPolicy
RetryPolicy
RetryPolicy
est une interface dans laquelle vous devez implémenter votre logique sur la façon dont vous souhaitez réessayer une demande particulière lorsqu'un délai d'expiration se produit.Il traite de ces trois paramètres
Par ex. Si RetryPolicy est créé avec ces valeurs
Nouvelle tentative 1:
Nouvelle tentative 2:
Donc, à la fin de Retry Attempt 2, si le délai d'expiration du socket se produit, Volley jettera 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));
la source
RetryPolicy
fait réellement l' implémentation.new DefaultRetryPolicy(
et assurez-vous de ne jamais réutiliser unRetryPolicy
objet, car l'objet est référencé tout au long du processus de demande, et des incréments de nouvelle tentative sont ajoutés sur la même valeur de délai d'expiration de l'objet, augmentant ainsi les délais d'expiration de vos futures demandes.Juste pour contribuer à mon approche. Comme déjà répondu,
RetryPolicy
c'est la voie à suivre. Mais 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 une GsonRequest qui s'étend à partir de cette BaseRequest, donc 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.
la source
/** * @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); }
la source
req.setRetryPolicy(new DefaultRetryPolicy( MY_SOCKET_TIMEOUT_MS, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Vous pouvez définir
MY_SOCKET_TIMEOUT_MS
comme 100. Ce que vous voulez définir est en millisecondes.DEFAULT_MAX_RETRIES
peut être 0 par défaut est 1.la source
int MY_SOCKET_TIMEOUT_MS=500; stringRequest.setRetryPolicy(new DefaultRetryPolicy( MY_SOCKET_TIMEOUT_MS, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
la source
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
la source
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 la même manière pour les deux
setConnectionTimeout()
etsetReadTimeout()
avec la valeur fromRetryPolicy
. Dans mon cas,Volley
lève une exception de délai d'expiration pour un gros morceau de données, voir:com.android.volley.toolbox.HurlStack.openConnection().
Ma solution est de créer une classe qui s'étend
HttpStack
avec ma propresetReadTimeout()
politique. Ensuite, utilisez-le lors de la créationRequestQueue
comme suit:Volley.newRequestQueue(mContext.getApplicationContext(), new MyHurlStack())
la source
J'ai fini par ajouter une méthode
setCurrentTimeout(int timeout)
àRetryPolicy
et sa mise en œuvre dansDefaultRetryPolicy
.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 fait et hourra pour l'open source.
la source