2010-09-02 8 views

risposta

86

Basta usare il metodo removeCallbacks(Runnable r).

+5

È possibile rimuovere i callback per i runnable anonimi? –

+7

Io non la penso così ... dovrai usare quelli non anonimi. Altrimenti non sarai in grado di farvi riferimento in futuro. – Cristian

+3

Vedere la risposta di @ NameSpace. Puoi rimuovere i runnable in sospeso se pubblichi il runnable con un token. Oppure puoi usare il metodo di Daniel L. di rimuovere tutti i callback/messaggi usando un token nullo. – vman

8

Se si utilizza la ricorsione, è possibile ottenere ciò passando "questo". Vedi il codice qui sotto.

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); 
} 

Questo esempio imposta il testo di un TextView (timer) ogni secondo, il conto alla rovescia. Una volta che arriva a 0, rimuoverà il TextView dall'interfaccia utente e disabiliterà il conto alla rovescia. Questo è utile solo per qualcuno che sta usando la ricorsione, ma sono arrivato qui a cercarlo, quindi sto postando i miei risultati.

80

risposta di Cristian è corretta, ma a differenza di quanto indicato nei commenti la risposta è, in realtà si può rimuovere callback per anonima Runnables chiamando removeCallbacksAndMessages(null);

Come affermato here:

Rimuovere tutti i post in sospeso di callback e messaggi inviati il ​​cui oggetto è token. Se il token è nullo, tutti i callback e i messaggi verranno rimossi.

+4

Vorrei solo precisare che questo comportamento è diverso sia che si tratti di un 'Handler' o di una' View'. In una classe 'View' (e forse dopo la 4.0?), Devi usare lo stesso oggetto' Runnable' per annullare l'operazione, mentre con una classe 'Handler' saranno semplicemente annullati se passerai' null'. Tuttavia, la domanda specifica un 'Handler' quindi la risposta è corretta. – Andre

+1

davvero !! grazie .. ci sono alcuni runnable lì, e removeCallbacks non ha fatto niente !!!!! ma questo è davvero workd :) thx – cV2

10

Questa è una risposta in ritardo, ma qui è un metodo diverso per cui solo si desidera rimuovere una specifica categoria di runnables dal gestore (ad esempio nel caso di OP, è sufficiente rimuovere la stretta di animazione, lasciando altri runnables in coda):

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); 

Il codice precedente eseguirà solo "r3" e quindi "r4". Ciò ti consente di rimuovere una categoria specifica di runnables definiti dal tuo token, senza la necessità di mantenere alcun riferimento ai runnables stessi.

Nota: il codice sorgente confronta i token utilizzando solo l'operando "==" (non chiama .equals()), quindi è meglio utilizzare ints/Integers anziché stringhe per il token.