J'ai un gestionnaire de ma sous-activité qui a été appelé par l' activité principale . Ce gestionnaire est utilisé par les sous-classes de postDelay
certains Runnables, et je ne peux pas les gérer. Maintenant, dans l' onStop
événement, je dois les supprimer avant de terminer l'activité (d'une manière ou d'une autre j'ai appelé finish()
, mais il appelle encore et encore). Est-il possible de supprimer tous les rappels d'un gestionnaire?
java
android
callback
android-handler
Luke Vo
la source
la source
removeCallbacksAndMessages(null)
ne supprimerait pas certains de mes rappels. Lorsque je voulais arrêter de recevoirhandler.removeCallbacksAndMessages(null)
des rappels, j'appelais et définissais mon gestionnaire sur null, mais comme je recevais toujours le rappel, je rencontrais un NPE lorsque je voulais faire une boucle avechandler.postDelayed()
.yourHandler.removeCallbacks(yourRunnable)
était le plus fiable. J'utilise toujours ça aujourd'hui.Pour toute
Runnable
instance spécifique , appelezHandler.removeCallbacks()
. Notez qu'il utilise l'Runnable
instance elle-même pour déterminer les rappels à annuler, donc si vous créez une nouvelle instance à chaque fois qu'une publication est effectuée, vous devez vous assurer que vous avez des références à l'exactRunnable
à annuler. Exemple:Vous pouvez appeler
myHandler.postDelayed(myRunnable, x)
pour publier un autre rappel dans la file d'attente de messages à d'autres endroits de votre code et supprimer tous les rappels en attente avecmyHandler.removeCallbacks(myRunnable)
Malheureusement, vous ne pouvez pas simplement "effacer" l'intégralité
MessageQueue
de aHandler
, même si vous faites une demande pour l'MessageQueue
objet qui lui est associé car les méthodes d'ajout et de suppression d'éléments sont protégées par le package (seules les classes du package android.os peuvent les appeler). Vous devrez peut-être créer uneHandler
sous-classe mince pour gérer une liste deRunnable
s au fur et à mesure de leur publication / exécution ... ou chercher un autre paradigme pour passer vos messages entre chaqueActivity
J'espère que cela pourra aider!
la source
Si vous n'avez pas les références Runnable, lors du premier rappel, obtenez l'obj du message et utilisez removeCallbacksAndMessages () pour supprimer tous les rappels associés.
la source
Définissez un nouveau gestionnaire et exécutable:
Poste d'appel retardé:
Supprimez votre rappel de votre gestionnaire:
la source
Veuillez noter que l'on doit définir une
Handler
et uneRunnable
portée en classe, afin qu'il soit créé une fois.removeCallbacks(Runnable)
fonctionne correctement, sauf si on les définit plusieurs fois. Veuillez consulter les exemples suivants pour une meilleure compréhension:Manière incorrecte:
Si vous appelez
onClick(..)
méthode, vous n'arrêtez jamais d'doIt()
appeler méthode avant d'appeler. Parce que chaque fois créenew Handler
etnew Runnable
instances. De cette façon, vous avez perdu les références nécessaires qui appartiennent au gestionnaire et aux instances exécutables .Façon correcte:
De cette façon, vous ne perdez pas les références réelles et
removeCallbacks(runnable)
fonctionne correctement.Phrase clé est que « les définissent comme globale dans votre
Activity
ouFragment
ce que vous utilisez » .la source
Comme
josh527
dit,handler.removeCallbacksAndMessages(null);
peut fonctionner.Mais pourquoi?
Si vous regardez le code source, vous pouvez le comprendre plus clairement. Il existe 3 types de méthode pour supprimer les rappels / messages du gestionnaire (MessageQueue):
Handler.java (laisser une méthode de surcharge)
MessageQueue.java fait le vrai travail:
la source