web-dev-qa-db-fra.com

Android Volley double publication lorsque la demande est lente

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.

57
aristo_sh

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));
44
Droid_Mechanic

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!

15
user4173064

J'ai trouvé la solution pour le double post, je viens de définir le délai d'attente à 0.

9
aristo_sh

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
                )
        );
4
xiaoyee

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));
4
Alberto Penas

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

3
AB1209

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());
2
Vitali Pekelis

veuillez augmenter le temps setRetryPolicy.

request.setRetryPolicy(new DefaultRetryPolicy(
                    30000,
                    DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
            Volley.newRequestQueue(this).add(equest);
2
Jatin Devani

J'ai posé une question similaire ici:

Android Volley adresse 2 requêtes au serveur lorsque la stratégie de nouvelle tentative est définie sur

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.

2
user921509

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

1
pmellaaho

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
RahulSonkhiya

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;
}
1
Amoliski

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

request.setRetryPolicy(new DefaultRetryPolicy(20000, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
0
ayyb1988

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

0
Nouman Ch
request.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

Cela a fonctionné pour moi.

0
Ahsanwarsi

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.

0
Artist404