Ich habe einen Handler von meiner Unteraktivität, die von der Haupt genannt wurde Aktivität . Dieser Handler wird von Unterklassen für postDelay
einige Runnables verwendet, und ich kann sie nicht verwalten. Jetzt muss onStop
ich sie für den Fall entfernen, bevor ich die Aktivität beende (irgendwie habe ich angerufen finish()
, aber es wird immer wieder aufgerufen ). Gibt es überhaupt eine Möglichkeit, alle Rückrufe von einem Handler zu entfernen?
java
android
callback
android-handler
Luke Vo
quelle
quelle
removeCallbacksAndMessages(null)
damit, einige meiner Rückrufe nicht zu entfernen. Wenn ichhandler.removeCallbacksAndMessages(null)
keine Rückrufe mehr erhalten möchte, rufe ich an und setze meinen Handler auf null. Da ich den Rückruf jedoch weiterhin erhalten würde, würde ich auf eine NPE stoßen, wenn ich eine Schleife durchführen möchtehandler.postDelayed()
.yourHandler.removeCallbacks(yourRunnable)
es am zuverlässigsten ist , eine Instanz Ihres Laufprogramms zu halten und zu verwenden . Ich benutze das heute noch.Runnable
Rufen Sie für eine bestimmte Instanz anHandler.removeCallbacks()
. Beachten Sie, dass dieRunnable
Instanz selbst verwendet wird, um zu bestimmen, welche Rückrufe abgemeldet werden sollen. Wenn Sie also jedes Mal, wenn ein Beitrag erstellt wird, eine neue Instanz erstellen, müssen Sie sicherstellen, dass Sie Verweise auf die genauenRunnable
Abbrüche haben, die abgebrochen werden sollen. Beispiel:Sie können anrufen,
myHandler.postDelayed(myRunnable, x)
um an anderen Stellen in Ihrem Code einen weiteren Rückruf in die Nachrichtenwarteschlange zu stellen, und alle ausstehenden Rückrufe mit entfernenmyHandler.removeCallbacks(myRunnable)
Leider können Sie nicht einfach das gesamte "löschen"
MessageQueue
für aHandler
, selbst wenn Sie eine Anfrage für dasMessageQueue
zugehörige Objekt stellen, da die Methoden zum Hinzufügen und Entfernen von Elementen paketgeschützt sind (nur Klassen innerhalb des android.os-Pakets können sie aufrufen). Möglicherweise müssen Sie eine dünneHandler
Unterklasse erstellen , um eine Liste vonRunnable
s zu verwalten, während diese veröffentlicht / ausgeführt werden ... oder ein anderes Paradigma für die Weitergabe Ihrer Nachrichten zwischen den einzelnen Klassen betrachtenActivity
Hoffentlich hilft das!
quelle
Wenn Sie nicht über die ausführbaren Referenzen verfügen, rufen Sie beim ersten Rückruf das Objekt der Nachricht ab und entfernen Sie alle zugehörigen Rückrufe mit removeCallbacksAndMessages () .
quelle
Definieren Sie einen neuen Handler und eine ausführbare Datei:
Anrufpost verspätet:
Entfernen Sie Ihren Rückruf von Ihrem Handler:
quelle
Bitte beachten Sie, dass man einen
Handler
und einenRunnable
In-Class-Bereich definieren sollte , damit er einmal erstellt wird.removeCallbacks(Runnable)
funktioniert korrekt, es sei denn, man definiert sie mehrmals. Bitte schauen Sie sich zum besseren Verständnis die folgenden Beispiele an:Falscher Weg:
Wenn Sie
onClick(..)
method aufrufen , beenden Sie den Methodenaufruf niedoIt()
, bevor er aufgerufen wird. Denn jedes Mal erstelltnew Handler
undnew Runnable
Instanzen. Auf diese Weise haben Sie die erforderlichen Referenzen verloren, die zu Handler- und ausführbaren Instanzen gehören.Der richtige Weg :
Auf diese Weise verlieren Sie keine tatsächlichen Referenzen und
removeCallbacks(runnable)
arbeiten erfolgreich.Der Schlüsselsatz lautet: "Definieren Sie sie als global in Ihrem
Activity
oder dem,Fragment
was Sie verwenden" .quelle
Wie
josh527
gesagt,handler.removeCallbacksAndMessages(null);
kann funktionieren.Aber wieso?
Wenn Sie sich den Quellcode ansehen, können Sie ihn besser verstehen. Es gibt drei Arten von Methoden zum Entfernen von Rückrufen / Nachrichten aus dem Handler (die MessageQueue):
Handler.java (Überlastungsmethode belassen)
MessageQueue.java erledigen die eigentliche Arbeit:
quelle