J'ai un problème avec Volley POST sur un réseau lent. Chaque fois que je vois BasicNetwork.logSlowRequests
dans mon LogCat, ma demande POST est exécutée deux fois ou plus, résultant en plusieurs publications (2 ou plus)) pour la demande 1. J'ai déjà défini la stratégie de nouvelle tentative sur 0, mais cela n'aide pas. .
C'est mon logcat
03-16 01: 31: 35.674: D/Volley (5984): [19807] BasicNetwork.logSlowRequests: Réponse HTTP à la demande = <[] http: // [myserver]/api/places 0xfa7d0c33 NORMAL 1> [durée de vie = 3824], [taille = 313], [rc = 200], [nouvelle tentative = 0] 03-16 01: 31: 35.704: D/Volley (5984): [1] Request.finish: 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, aidez-moi, je cherche désespérément une solution à ce problème.
Ajoutez les valeurs suivantes à votre objet Request:
request.setRetryPolicy(new DefaultRetryPolicy(
DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Here: request est votre objet de JsonObjectRequest. Modifiez la valeur du multiplicateur en fonction de DEFAULT TIMEOUT VALUE dans la classe DefaultRetryPolicy de Volley.
Vous pouvez également définir le premier argument sur 0, comme ci-dessous:
request.setRetryPolicy(new DefaultRetryPolicy(
0,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Régler simplement le délai d'attente dans la nouvelle stratégie sur 0 est trop peu. Après avoir vérifié la source, vous devez définir le nombre maximal de tentatives <0, car il vérifie le courant <= max ...
J'ai corrigé le double affichage avec la définition de la politique suivante
new DefaultRetryPolicy(0, -1, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
J'espère que ça aide!
J'ai trouvé la solution pour le double post, je viens de définir le délai d'attente à 0.
J'ai trouvé la solution pour le bug multi post.
Changer la nouvelle politique. J'ai mis la valeur de délai d'attente à 50000ms, a bien fonctionné
request.setRetryPolicy(
new DefaultRetryPolicy(
500000,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT
)
);
Vous devez définir RetryPolicy sur 0 nouvelles tentatives et vous assurer que le délai d'attente est supérieur au délai d'attente du serveur.
setRetryPolicy(new DefaultRetryPolicy("bigger than server timeout",
0,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Je suis capable de résoudre ce problème de deux manières.
Le premier est changé le RetryPolicy
. Il suffit de définir la valeur du délai d’exécution sur le double du délai d’expiration 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 méthode 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());
J'espère que ça aide :)
Cela fonctionne pour moi.
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());
veuillez augmenter le temps setRetryPolicy.
request.setRetryPolicy(new DefaultRetryPolicy(
30000,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Volley.newRequestQueue(this).add(equest);
J'ai posé une question similaire ici:
J'ai réussi à résoudre ce problème en définissant la propriété keep-alive à false dans Android, par exemple:
System.setProperty("http.keepAlive", "false")
J'ai ajouté cette ligne de code à l'intérieur de la classe où j'ai importé requestqueue et effectué les requêtes.
En outre, vérifiez si votre serveur a l'en-tête Keep-Alive.
Ceci post a aidé à trouver la solution.
J'ai réussi à résoudre ce problème en configurant HttpURLConnection comme ceci:
connection.setChunkedStreamingMode(0);
J'ai lancé une discussion à ce sujet dans la liste de diffusion 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));
Le seul moyen d'arrêter les doubles demandes était de définir la stratégie de nouvelle tentative sur -1
request.setRetryPolicy(new DefaultRetryPolicy(0, -1, 0));
Je pense que cela est dû au fait que la logique de DefaultRetryPolicy pour les tentatives restantes renvoie true si retryCount vaut 0 et que Max retries vaut également 0 dans la méthode hasAttemptRemaining ():
protected boolean hasAttemptRemaining() {
return this.mCurrentRetryCount <= this.mMaxNumRetries;
}
juste maxNumRetries = 0
pas de travail. set TIMEOUT_MS 20000
.
request.setRetryPolicy(new DefaultRetryPolicy(20000, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
corriger le Android date
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _--ce soit soit ce que j’ai résolu mon problème, j’ai modifié mon Android date et je reçois une erreur de sécurité SSL).
request.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Cela a fonctionné pour moi.
Essayé beaucoup de choses mais à la fin rien n'a aidé. Enfin, j'ai calculé la combinaison de modifications suivante:
sr.setRetryPolicy(new DefaultRetryPolicy(0,-1, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Et dans votre connexion hurl en classe d’application, ajoutez ceci:
httpsURLConnection.setChunkedStreamingMode(0);
Cela a fonctionné sans heurts pour empêcher Volley de faire face à plusieurs requêtes sur le serveur.