Android Volley double poteau quand ont requête lente
j'ai un problème avec la requête de Volley POST sur le réseau lent. Chaque fois que je vois BasicNetwork.logSlowRequests
dans mon LogCat, ma requête POST est exécutée deux fois ou plus résultant plusieurs (2 ou plus) messages pour 1 requête. J'ai déjà mis la Politique de Ré-essai à 0, mais ça n'aide pas.
C'est mon LogCat
03-16 01:31:35.674: D / Volley(5984): [19807] BasicNetwork.logSlowRequests: réponse HTTP pour request=<[ ] http://[serveur]/api/lieux 0xfa7d0c33 NORMAL 1> [durée de vie=3824], [size=313], [rc=200], [retryCount=0] 03-16 01: 31: 35.704: D / Volley(5984): [1] Request.terminer: 3853 ms: [ ] http: / /[myserver] / api / places 0xfa7d0c33 NORMAL 1
C'est mon code
JSONObject body = new JSONObject();
try {
body.put(PROTO_BODY_AUTHORIZATION, Sessions.getActiveSession().getToken());
} catch (JSONException e) {
e.printStackTrace();
}
JsonObjectRequest request = new JsonObjectRequest(
Request.Method.POST,
context.getResources().getString(R.string.server_address) + "/places",
body,
callback,
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(context, error.getMessage(), Toast.LENGTH_LONG).show();
}
}
);
request.setRetryPolicy(
new DefaultRetryPolicy(
DefaultRetryPolicy.DEFAULT_TIMEOUT_MS,
0,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
getRequestQueue().add(request);
s'il vous Plaît aider, j'ai désespérément de trouver une solution pour ce problème.
16 réponses
ajouter les valeurs suivantes à votre objet de requête:
request.setRetryPolicy(new DefaultRetryPolicy(
DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
ici: la demande est l'objet de votre JsonObjectRequest. Changez la valeur de multiplicateur en fonction de la valeur de délai par défaut dans la classe DefaultRetryPolicy dans Volley.
vous pouvez également définir le premier argument à 0, comme ci-dessous:
request.setRetryPolicy(new DefaultRetryPolicy(
0,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
mettre le temps D'arrêt dans la Rétrypolicy à 0 est trop peu. Après avoir vérifié la source, vous devez en fait définir le nombre maximum de tentatives < 0, car il s'agit de vérifier le courant <= max...
, je fixe le double affichage avec la définition de la politique à la suite de
new DefaultRetryPolicy(0, -1, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Espère que cela aide!
j'ai trouvé la solution pour le double poteau, je viens de mettre le délai à 0.
je suis capable de résoudre cette question de deux façons.
est remplacé par RetryPolicy
.
Il suffit de mettre la valeur timeout au double du timeout par défaut. A bien fonctionné. Vous pouvez également essayer d'autres valeurs.
request.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
une autre façon consiste à définir connection.setChunkedStreamingMode(0);
dans openConnection
méthode HurlStack
classe.
je crée mon RequestQueue
comme ceci requestQueue = Volley.newRequestQueue(context, new HurlStack());
Espère que cela aide :)
j'ai trouvé la solution pour le bug multi post.
changer la Rétrypolicy. J'ai réglé la valeur de timeout à 50000ms, ça a bien marché. Comme ceci:
request.setRetryPolicy(
new DefaultRetryPolicy(
500000,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT
)
);
vous devez régler la Rétrypolicy à 0 retries et vous assurer que le délai est plus long que le délai du serveur.
setRetryPolicy(new DefaultRetryPolicy("bigger than server timeout",
0,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
ça me va.
public class MyRetryPolicyWithoutRetry implements RetryPolicy
{
@override
public int getCurrentTimeout()
{
return CONNECTION_TIME_OUT; /200000/
}
@Override
public int getCurrentRetryCount()
{
return 0;
}
@Override
public void retry(VolleyError error) throws VolleyError
{
throw(error);
}
}
à utiliser:
request.setRetryPolicy(new MyRetryPolicyWithoutRetry());
j'ai posé une question similaire ici:
Android Volley fait 2 requêtes vers le serveur lorsque la Politique de rétry est fixée à 0
j'ai réussi à résoudre ce problème en mettant la propriété keep-alive à false dans Android, par exemple:
System.setProperty("http.keepAlive", "false")
j'ai ajouté cette ligne de code dans la classe où j'importe requestqueue et je fais les requêtes.
vérifiez aussi si votre serveur keep-alive-tête.
Ce post a aidé à arriver à la solution.
j'ai réussi à corriger cela en configurant HttpURLConnection comme ceci:
connection.setChunkedStreamingMode(0);
j'ai commencé une discussion à ce sujet dans la liste de messagerie de Volley ( https://groups.google.com/forum/#!topic/volley-users / 8PE9dBbD6iA ).
vous pouvez utiliser ceci pour résoudre le problème.
StringRequest.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
s'il vous plaît augmenter le temps de setrypolicy.
request.setRetryPolicy(new DefaultRetryPolicy(
30000,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Volley.newRequestQueue(this).add(equest);
juste maxNumRetries = 0
pas de travail.
set TIMEOUT_MS 20000
.
request.setRetryPolicy(new DefaultRetryPolicy(20000, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
request.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
ça a marché pour moi.
la seule façon que j'ai eu les doubles demandes d'arrêter était de mettre la Politique de retour à -1
request.setRetryPolicy(new DefaultRetryPolicy(0, -1, 0));
je pense que c'est parce que la logique de DefaultRetryPolicy pour les tentatives restantes retourne vrai si retryCount est 0 et Max retries est aussi 0 dans la méthode hasAttemptRemaining ():
protected boolean hasAttemptRemaining() {
return this.mCurrentRetryCount <= this.mMaxNumRetries;
}
corriger le android date
corrige mon problème malheureusement pour des raisons de test, j'ai changé ma date android et obtenir une erreur de sécurité ssl.
a essayé beaucoup de choses mais à la fin rien n'a aidé. Enfin, j'ai trouvé la combinaison suivante de changements:
sr.setRetryPolicy(new DefaultRetryPolicy(0,-1, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
et dans votre connexion hurl dans la classe d'application, ajoutez ceci:
httpsURLConnection.setChunkedStreamingMode(0);
cela a fonctionné en douceur pour arrêter Volley frapper la demande multiple au serveur.