Domanda

Ho un "aperta" di animazione e sto usando Handler.postDelayed(Runnable, delay) per innescare un "chiudere" l'animazione dopo un breve ritardo. Tuttavia, durante il tempo tra apertura e la chiusura, v'è forse un'altra animazione innescato da un clic.

La mia domanda è, come faccio a cancellare la "chiudere" di animazione nel gestore?

È stato utile?

Soluzione

Basta usare la removeCallbacks(Runnable r) metodo.

Altri suggerimenti

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

Come affermato qui :

  

Rimuovere eventuali messaggi in attesa di callback e messaggi inviati cui obj è token. Se gettone è nullo, verranno rimosse tutte le richiamate e messaggi .

Questa è una risposta in ritardo, ma qui è un metodo diverso per quando 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 sopra eseguirà solo "r3" e quindi "r4". Questo consente di rimuovere una categoria specifica di runnables definite dal token, senza bisogno di tenere tutti i riferimenti alle runnables stessi.

Nota: il codice sorgente confronta gettoni usando le "==" operando solo (non chiama .equals ()), quindi è meglio usare int / Interi invece di stringhe per il token.

Se la vostra utilizzando la ricorsione, è possibile raggiungere questo obiettivo facendo passare "questo". Vedere 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 imposterà il testo di una TextView (timer) ogni secondo, il conto alla rovescia. Una volta che si arriva a 0, si rimuova il TextView dall'interfaccia utente e disabilitare il conto alla rovescia. Questo è utile solo per qualcuno che sta usando la ricorsione, ma sono arrivato qui alla ricerca di questo, quindi sto postando i miei risultati.

Se si desidera rimuovere il callback per un Runnable anonimo basta eseguire: handler = null Tutto sarà rimosso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top