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?
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));
Pour gérer Android Volley Timeout, vous devez utiliser RetryPolicy
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
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:
Nouvelle tentative 2:
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));
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.
/**
* @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);
}
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.
int MY_SOCKET_TIMEOUT_MS=500;
stringRequest.setRetryPolicy(new DefaultRetryPolicy(
MY_SOCKET_TIMEOUT_MS,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
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
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())
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.