Frage

Ich habe eine "offen" Animation und bin mit Handler.postDelayed(Runnable, delay) einer auslösen "close" Animation nach einer kurzen Verzögerung. Doch während der Zeit zwischen Öffnen und Schließen, gibt es möglicherweise eine weitere Animation durch einen Klick ausgelöst.

Meine Frage ist, wie würde ich Sie die "close" Animation im Handler?

War es hilfreich?

Lösung

Verwenden Sie einfach die removeCallbacks(Runnable r) Methode.

Andere Tipps

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 zu entfernen, indem removeCallbacksAndMessages(null); Aufruf

Wie bereits erwähnt hier :

  

Entfernen Sie alle Beiträge von Rückrufen und gesendeten Nachrichten, deren ausstehende obj Token. Wenn Token null ist, werden alle Rückrufe und Nachrichten werden entfernt .

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

    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 wird „r3“ ausführen und dann „r4“ nur. Auf diese Weise können Sie eine bestimmte Kategorie von Runnables von Token definiert entfernen, ohne dass sich alle Verweise auf den Runnables zu halten brauchen.

Hinweis: die Quellcode vergleicht Token mit dem „==“ Operanden nur (es ruft nicht .equals ()), also am beste ints verwenden / Ganze Zahlen anstelle von Strings für das Token.

Wenn Sie Ihre Rekursion verwenden, können Sie diese acheive von „this“ vorbei. 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 (Timer) jede Sekunde eingestellt, heruntergezählt. Sobald es auf 0 wird, wird die das Textview von der Benutzeroberfläche entfernen und den Countdown deaktivieren. Dies ist nur sinnvoll für jemanden, die Rekursion verwendet, aber ich kam für die hier gesucht, so dass ich meine Ergebnisse bin Entsendung.

Wenn Sie den Rückruf für einen anonymen Runnable nur laufen entfernen möchten: handler = null Alles wird entfernt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top