Mam moduł obsługi z mojego poddziałania, który został wywołany przez główne działanie . Ten moduł obsługi jest używany przez podklasy postDelay
niektórych Runnables i nie mogę nimi zarządzać. Teraz, w onStop
przypadku, muszę je usunąć przed zakończeniem działania (jakoś zadzwoniłem finish()
, ale wciąż dzwoni ponownie). Czy istnieje sposób na usunięcie wszystkich wywołań zwrotnych z modułu obsługi?
java
android
callback
android-handler
Luke Vo
źródło
źródło
removeCallbacksAndMessages(null)
że nie usuną niektórych moich oddzwonień. Gdybym chciał przestać odbierać wywołania zwrotne, zadzwoniłemhandler.removeCallbacksAndMessages(null)
i ustawiłem mój moduł obsługi na zero, ale ponieważ nadal otrzymywałbym wywołanie zwrotne, napotkałem NPE, gdy chciałbym zapętlićhandler.postDelayed()
.yourHandler.removeCallbacks(yourRunnable)
było najbardziej niezawodne. Nadal tego używam dzisiaj.W przypadku dowolnej konkretnej
Runnable
instancji zadzwońHandler.removeCallbacks()
. Zauważ, że korzysta on zRunnable
samej instancji, aby określić, które oddzwaniania należy wyrejestrować, więc jeśli tworzysz nową instancję za każdym razem, gdy publikowany jest post, musisz upewnić się, że masz odniesienia do dokładnegoRunnable
anulowania. Przykład:Możesz zadzwonić,
myHandler.postDelayed(myRunnable, x)
aby opublikować kolejne wywołanie zwrotne w kolejce wiadomości w innych miejscach kodu i usunąć wszystkie oczekujące wywołania zwrotne za pomocąmyHandler.removeCallbacks(myRunnable)
Niestety, nie można po prostu „wyczyścić” Cały
MessageQueue
dlaHandler
, nawet jeśli się z wnioskiem oMessageQueue
obiektu związanego z nim ponieważ metody dodawania i usuwania elementów pakietów są zabezpieczone (tylko klas w pakiecie android.os można je nazwać). Być może będziesz musiał utworzyć cienkąHandler
podklasę, aby zarządzać listąRunnable
s, gdy są one publikowane / wykonywane ... lub spójrz na inny paradygmat przekazywania wiadomości między nimiActivity
Mam nadzieję, że to pomoże!
źródło
Jeśli nie masz odwołań Runnable, przy pierwszym wywołaniu zwrotnym pobierz obiekt obj wiadomości i użyj removeCallbacksAndMessages (), aby usunąć wszystkie powiązane wywołania zwrotne.
źródło
Zdefiniuj nowy moduł obsługi i uruchom:
Opóźniony post połączenia:
Usuń połączenie zwrotne z programu obsługi:
źródło
Należy pamiętać, że należy zdefiniować zakres A
Handler
oraz ARunnable
w klasie, aby był on utworzony raz.removeCallbacks(Runnable)
działa poprawnie, chyba że zdefiniuje się je wiele razy. Aby lepiej zrozumieć, spójrz na następujące przykłady:Niepoprawny sposób:
Jeśli wywołasz
onClick(..)
metodę, nigdy nie przestanieszdoIt()
wywoływać metody przed jej wywołaniem. Ponieważ za każdym razem tworzynew Handler
inew Runnable
instancje. W ten sposób utraciłeś niezbędne referencje, które należą do instancji procedury obsługi i uruchamiania .Właściwa droga :
W ten sposób nie straciłeś faktycznych referencji i
removeCallbacks(runnable)
działa z powodzeniem.Kluczowe zdanie brzmi: „zdefiniuj je jako globalne w swoim
Activity
lub wFragment
tym, czego używasz” .źródło
Jak
josh527
powiedziano,handler.removeCallbacksAndMessages(null);
może działać.Ale dlaczego?
Jeśli spojrzysz na kod źródłowy, możesz go lepiej zrozumieć. Istnieją 3 rodzaje metod usuwania wywołań zwrotnych / komunikatów z modułu obsługi (MessageQueue):
Handler.java (pozostaw metodę przeciążenia)
MessageQueue.java wykona prawdziwą pracę:
źródło