Comment faire pour supprimer tous les rappels à partir d'un Gestionnaire?
J'ai un Gestionnaire de mon sous-Activité qui a été appelé par le principal L'activité. Ce Gestionnaire est utilisé par les sous-classes pour postDelay
certains Runnables, et je ne peux pas les gérer. Maintenant, dans le onStop
cas, j'ai besoin de les enlever avant la fin de l'Activité (d'une certaine manière, j'ai appelé finish()
, mais il encore l'appeler encore et encore). Est-il de toute façon à supprimer tous les rappels à partir d'un Gestionnaire?
Vous devez vous connecter pour publier un commentaire.
Dans mon expérience de l'appel de cette très travaillé!
Dans les docs pour removeCallbacksAndMessages qu'il dit...
removeCallbacksAndMessages(null)
ne serait pas supprimer certains de mes rappels. Quand j'ai envie d'arrêter de recevoir des Rappels, je diraishandler.removeCallbacksAndMessages(null)
et mis mon gestionnaire à null, mais depuis que je ne reçois toujours le rappel, j'avais rencontre un NPE quand je veux faire une boucle avechandler.postDelayed()
.yourHandler.removeCallbacks(yourRunnable)
les plus fiables. Reste encore aujourd'hui.Pour tout
Runnable
instance, appelHandler.removeCallbacks()
. Notez qu'il utilise leRunnable
instance de déterminer lui-même les rappels pour annuler l'inscription, donc si vous êtes à la création d'une nouvelle instance à chaque fois qu'un post est fait, vous devez vous assurer que vous avez des références à l'exactRunnable
pour annuler. Exemple:Vous pouvez appeler
myHandler.postDelayed(myRunnable, x)
de poster un autre rappel de la file d'attente de messages à d'autres endroits dans votre code, et de supprimer tous les rappels en attente avecmyHandler.removeCallbacks(myRunnable)
Malheureusement, vous ne pouvez pas simplement "clair" sur l'ensemble du
MessageQueue
pour unHandler
, même si vous faites une demande pour laMessageQueue
objet associé, car les méthodes d'ajout et de suppression d'éléments sont paquet protégé (seules les classes au sein de l'android.package du système d'exploitation puissent les appeler). Vous pourriez avoir à créer une fineHandler
sous-classe pour gérer une liste deRunnable
s qu'ils sont détachés/exécutée...ou de regarder un autre paradigme pour passer vos messages entre chaqueActivity
Espère que ça Aide!
Si vous n'avez pas l'Exécutable références, sur le premier rappel, obtenir l'obj du message, et l'utilisation removeCallbacksAndMessages() pour supprimer tous les rappels associés.
Définir un nouveau gestionnaire et praticable:
Poste retardé:
Supprimer votre rappel à partir de votre gestionnaire de:
Veuillez noter que l'on doit définir un
Handler
et unRunnable
dans la classe de la portée, de sorte qu'il est créé une seule fois.removeCallbacks(Runnable)
fonctionne correctement à moins que l'on définit à plusieurs reprises. S'il vous plaît regarder à la suite des exemples pour mieux comprendre:La mauvaise voie :
Si vous appelez
onClick(..)
méthode, vous ne jamais cesser dedoIt()
l'appel de méthode avant de l'appeler. Parce qu'à chaque fois créenew Handler
etnew Runnable
instances. De cette façon, vous avez perdu les références qui appartiennent à gestionnaire et praticable instances.Façon correcte :
De cette façon, vous n'avez pas perdu de réelles références et
removeCallbacks(runnable)
fonctionne correctement.Phrase clé est que "définir comme globale dans votre
Activity
ouFragment
ce que vous utilisez".Comme
josh527
dit,handler.removeCallbacksAndMessages(null);
peut travailler.Mais pourquoi?
Si vous regardez le code source, vous pouvez le comprendre plus clairement.
Il y a 3 type de méthode pour supprimer les rappels ou de messages de gestionnaire(le MessageQueue):
Handler.java (laisser de la surcharge de méthode)
MessageQueue.java faire le vrai travail: