web-dev-qa-db-fra.com

Android - annuler la demande Volley

J'utilise Android Libley Volley dans mon projet pour exécuter les requêtes réseau, tout fonctionne très bien mais j'ai quelques problèmes avec la fonction "annuler" de cette lib. J'explique mon problème ..

J'ai une activité, où j'exécute la demande à la méthode OnCreate, la demande est appelée, pas de problème. Mais pour être sûr que la méthode cancel fonctionne, je voulais tester et essayer 2 choses:

  1. Je lance ma demande et juste après l'annuler comme ceci:

    MySingleton.getMyData("urltocall", getDataListener, requestTag);MySingleton.getRequestQueue().cancelAll(requestTag);

Celui-ci fonctionne! L'annulation est appelée (je le vois aussi dans la classe Request de Volley):

public void cancel() {
        mCanceled = true; // my breakpoint is called here
    }
  1. Je lance ma demande et juste après l'appel de la méthode finish () de mon activité et dans la méthode onDestroy et/ou onStop de l'activité, j'appelle le même code:

    MySingleton.getMyData("urltocall", getDataListener, requestTag);MySingleton.getRequestQueue().cancelAll(requestTag);

Mais cela ne fonctionne pas!

Le requestTag n'est pas nul et bien passé à Volley, donc je ne comprends pas pourquoi la première méthode fonctionne mais pas l'autre ... Sachant que mon but est d'annuler la requête lorsque onDestroy est appelée ..

Merci de votre aide

14
ejay

Je suppose que dans le premier cas, la requête n'a été ajoutée qu'à RequestQueue, c'est pourquoi l'appel de cancelAll() fonctionne. Dans le second cas, il y a un léger délai entre le démarrage de la requête et la pause/destruction du Activity: dans ce délai, la requête HTTP a commencé. Vous ne savez peut-être pas que l'appel à cancelAll() ne fonctionne que pour les requêtes qui sont encore dans RequestQueue. Cela ne fonctionne pas pour une requête HTTP qui a déjà commencé, il n'y a aucun moyen de l'arrêter.

Cela dit, la documentation ici implique qu'une fois qu'une demande est annulée (c'est-à-dire en appelant cancel()), elle peut effectivement être traitée comme si le service Web n'avait jamais été appelé dans le première place. Les rappels associés à la demande particulière ne seraient pas invoqués (bien que la réponse reçue soit probablement conservée dans le cache local).

17
Y.S

https://developer.Android.com/training/volley/simple.html#cancel

Cela dit essentiellement que

Une fois annulé, Volley garantit que votre gestionnaire de réponse ne sera jamais appelé.

Donc, même s'il n'y a aucun moyen d'annuler/d'annuler une demande http qui a déjà commencé (ce qui est logique), les rappels associés à la demande ne seront pas appelés, ce qui pour moi signifie effectivement que je peux traiter est une demande annulée dans la plupart des scénarios même si la réponse ainsi reçue en silence peut être disponible dans le cache.

7
mithril

Vous pouvez annuler un Request attaché à un TAG. Donc, fondamentalement, vous devez ajouter une balise avec chaque Request.

yourRequestObject.setTag(TAG);

RequestQueue mRequestQueue;

mRequestQueue.cancelAll(TAG);

De cette façon, vous pouvez annuler tous les Request avec un TAG particulier.

6
peeyush pathak

Je vous suggère d'annuler les demandes ajoutées dans la méthode onPause (). Considérant:

onPause () Le système appelle cette méthode comme la première indication que l'utilisateur quitte votre activité (bien que cela ne signifie pas toujours que l'activité est détruite). C'est généralement là que vous devez valider toutes les modifications qui devraient persister au-delà de la session utilisateur en cours (car l'utilisateur peut ne pas revenir). source: Développeurs Android

2
Andy