2014-09-30 10 views
5

W onDestory fragmentu, wstawiłem kod do czyszczenia wszystkich oczekujących runnables zacząłem używać Handler.postDelayed.Handler.removeCallbacksAndMessages (null) i główny looper

mUiHandler.removeCallbacksAndMessages(null); 

Mam tutaj pytanie. Czy można bezpiecznie wywoływać mUiHandler.removeCallbacksAndMessages (null) ;? Rozumiem, że Android wykonuje wszystkie operacje interfejsu użytkownika, takie jak układ interfejsu użytkownika, renderowanie interfejsu użytkownika, cykle życia komponentów (onCreate, onPause, onResume) w głównym looper. Czy rozumiem to poprawnie? Następnie, gdy wywołasz mUiHandler.removeCallbacksAndMessages (null) w fragmencie, zepsuje lub wyczyści wszystkie operacje UI systemu Android w kolejce komunikatów w głównym looperie, ponieważ w głównym looperie jest tylko jedna kolejka komunikatów.

Dzięki.

Odpowiedz

8

To spowoduje usunięcie tylko komunikatów i wywołań zwrotnych, które zostały wysłane do tego konkretnego Handler'a. Nie usunie niczego innego, więc tak, to jest bezpieczne. :)

EDYCJA: Dzieli się z Queue z Looper, ale sprawdza przed celem komunikatu, aby upewnić się, że pochodzi z tego samego Handler przed usunięciem. Od MessageQueue.java:

void removeCallbacksAndMessages(Handler h, Object object) { 
    if (h == null) { 
     return; 
    } 

    synchronized (this) { 
     Message p = mMessages; 

     // Remove all messages at front. 
     while (p != null && p.target == h 
       && (object == null || p.obj == object)) { 
      Message n = p.next; 
      mMessages = n; 
      p.recycle(); 
      p = n; 
     } 

     ... 
} 
+0

Dzięki kcoppock. Ale nadal jestem zdezorientowany. "Każda instancja Handler jest powiązana z pojedynczym wątkiem i kolejką komunikatów tego wątku." Każdy wątek powinien mieć jedną kolejkę komunikatów. Dobrze? Mój mUiHandler jest powiązany z głównym wątkiem, więc na dokumencie udostępni tę samą kolejkę komunikatów innym programom obsługi w wątkach interfejsu użytkownika. Czy coś ominąłem? – Kai

+1

Mam to. Spojrzałem na kod źródłowy. Wykonuje "p.target == h" check in removeCallbacksAndMessages. Tak jak powiedziałeś, usuwa tylko wiadomości i wywołania zwrotne, które zostały wysłane do tego konkretnego Handlera. Dzięki! – Kai

+0

Właśnie chciałem to opublikować, haha. :) Cieszę się, że to znalazłeś! – kcoppock

Powiązane problemy