2010-09-02 11 views

Antwort

86

Verwenden Sie einfach die removeCallbacks(Runnable r) Methode.

+5

Ist es möglich, Rückrufe für anonyme Runnables zu entfernen? –

+7

Ich glaube nicht ... Sie müssen nicht-anonyme verwenden. Andernfalls können Sie sie in Zukunft nicht mehr referenzieren. – Cristian

+3

Siehe @ NameSpace's Antwort. Sie können ausstehende Runnables entfernen, wenn Sie das Runnable mit einem Token veröffentlichen. Oder Sie können die Methode von Daniel L. verwenden, alle Rückrufe/Nachrichten mit einem Null-Token zu entfernen. – vman

8

Wenn Sie Rekursion verwenden, können Sie dies erreichen, indem Sie "this" übergeben. Siehe Code unten.

public void countDown(final int c){ 
    mHandler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      aq.id(R.id.timer).text((c-1)+""); 
      if(c <= 1){ 
       aq.id(R.id.timer).gone(); 
       mHandler.removeCallbacks(this); 
      }else{ 
       countDown(c-1); 
      } 
     } 
    }, 1000); 
} 

In diesem Beispiel wird der Text eines TextView (Zeitgebers) jede Sekunde gesetzt und herunter gezählt. Sobald es 0 erreicht, entfernt es den TextView von der Benutzeroberfläche und deaktiviert den Countdown. Dies ist nur nützlich für jemanden, der Rekursion verwendet, aber ich bin hier angekommen, um nach dem zu suchen, also poste ich meine Ergebnisse.

80

Cristian Antwort ist richtig, aber im Gegensatz zu dem, was in der Antwort der Kommentare angegeben ist, können Sie tatsächlich Rückrufe für anonyme Runnables entfernen removeCallbacksAndMessages(null);

Aufruf Wie here erklärte:

alle ausstehenden Beiträge entfernen von Callbacks und gesendete Nachrichten, deren Obj Token ist. Wenn token null ist, werden alle Rückrufe und Nachrichten entfernt.

+4

Ich möchte nur darauf hinweisen, dass dieses Verhalten unterschiedlich ist, ob es sich um eine Handler- oder eine View-Klasse handelt. In einer 'View'-Klasse (und vielleicht nach 4.0?) Müssen Sie dasselbe' Runnable'-Objekt verwenden, um die Aufgabe abzubrechen, während bei einer 'Handler'-Klasse alle einfach abgebrochen werden, wenn Sie' null' übergeben. Nichtsdestotrotz gibt die Frage einen 'Handler' an, damit Ihre Antwort richtig ist. – Andre

+1

wirklich !! danke .. hatte da runnable da, und removeCallbacks haben einfach nichts gemacht !!!!! aber das funktioniert wirklich :) thx – cV2

10

Dies ist eine späte Antwort, aber hier ist eine andere Methode, wenn Sie mögen nur eine bestimmte Kategorie von Runnables aus dem Handler (dh in OP Fall entfernen, nur die enge Animation entfernen, andere Runnables in der Warteschlange verlassen):

int firstToken = 5; 
    int secondToken = 6; 

    //r1 to r4 are all different instances or implementations of Runnable. 
    mHandler.postAtTime(r1, firstToken, 0); 
    mHandler.postAtTime(r2, firstToken, 0); 
    mHandler.postAtTime(r3, secondToken, 0); 

    mHandler.removeCallbacksAndMessages(firstToken); 

    mHandler.postAtTime(r4, firstToken, 0); 

Der obige Code führt nur "r3" und dann "r4" aus. Auf diese Weise können Sie eine bestimmte Kategorie von Runnables entfernen, die von Ihrem Token definiert wurden, ohne dass Referenzen auf die Runnables selbst vorhanden sein müssen.

Hinweis: Der Quellcode vergleicht Token nur mit dem Operanden "==" (er ruft nicht .equals() auf), daher sollten Sie am besten anstelle von Strings für das Token ints/Integers verwenden.