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.

51
demandé sur Mike 2014-03-15 23:01:22

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));
36
répondu Droid_Mechanic 2018-04-20 04:40:22

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!

14
répondu 2015-03-12 16:40:23

j'ai trouvé la solution pour le double poteau, je viens de mettre le délai à 0.

9
répondu aristo_sh 2014-04-03 09:34:27

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 :)

3
répondu AB1209 2014-12-11 11:09:37

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
                )
        );
3
répondu xiaoyee 2015-09-24 05:59:09

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));
3
répondu Alberto Penas 2017-06-02 05:23:40

ç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());
2
répondu Vitali Pekelis 2017-06-02 05:21:49

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.

2
répondu user921509 2017-06-02 05:23:08

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 ).

1
répondu pmellaaho 2014-05-26 08:26:51

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));
1
répondu RahulSonkhiya 2016-02-29 09:42:14

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);
1
répondu Jatin Devani 2016-07-06 11:44:44

juste maxNumRetries = 0 pas de travail. set TIMEOUT_MS 20000 .

request.setRetryPolicy(new DefaultRetryPolicy(20000, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
0
répondu ayyb1988 2015-04-21 02:18:42
request.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

ça a marché pour moi.

0
répondu Ahsanwarsi 2015-05-05 10:50:01

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;
}
0
répondu Amoliski 2016-12-16 18:45:44

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.

0
répondu Nouman Ch 2017-11-22 13:21:30

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.

0
répondu Artist404 2018-04-20 04:55:30