2011-09-13 9 views
28

Co jeśli mam już wątek handler.postDelayed w trakcie wykonywania i muszę go anulować?Jak anulować handler.postDelayed?

+0

Cały wątek lub po prostu wiadomość? –

+0

Cały wątek. – Eugene

+0

[Zamknij] (http://developer.android.com/reference/android/os/HandlerThread.html#quit()) it. –

Odpowiedz

46

Robię to, aby anulować postDelays, za Android: removeCallbacks usuwa wszystkie oczekujące posty Runnable r, które są w kolejce wiadomości.

handler.removeCallbacks(runnableRunner); 

lub użyć, aby usunąć wszystkie wiadomości i zwrotnych

handler.removeCallbacksAndMessages(null); 
+0

Więcej informacji z snipet: http://stackoverflow.com/questions/5885587/how-to-cancel-handler-incode – Basher51

9

Jeśli nie chcesz zachować odniesienie do runnable, można po prostu zadzwonić:

handler.removeCallbacksAndMessages(null); 

The official documentation mówi :

... Jeśli token ma wartość zero, al l zwroty i wiadomości zostaną usunięte.

0

Miałem instancję, w której musiałem anulować postDelayed podczas jego pracy, więc powyższy kod nie działał dla mojego przykładu. To, co w końcu robiłem, polegało na sprawdzeniu boolowskim wewnątrz mojego Runnable, więc kiedy kod został wykonany po upływie określonego czasu, byłby uruchamiany w oparciu o wartość boolowską w danym momencie i to dla mnie.

public static Runnable getCountRunnable() { 
    if (countRunnable == null) { 
     countRunnable = new Runnable() { 
      @Override 
      public void run() { 
       if (hasCountStopped) 
        getToast("The count has stopped"); 
      } 
     }; 
    } 
    return countRunnable; 
} 

FYI - w mojej działalności zniszczyć zrobić użyć kodu sugerowane przez innych programistów, handler.removecallback i handler = null; aby anulować uchwyt, aby zachować czystość kodu i upewnić się, że wszystko zostanie usunięte.