Ich habe eine "offene" Animation und verwende Handler.postDelayed(Runnable, delay)
, um nach einer kurzen Verzögerung eine "geschlossene" Animation auszulösen . In der Zeit zwischen Öffnen und Schließen wird möglicherweise eine andere Animation durch einen Klick ausgelöst.
Meine Frage ist, wie würde ich die "Schließen" -Animation im Handler abbrechen ?
android
handler
runnable
postdelayed
Bruce Lee
quelle
quelle
Antworten:
Verwenden Sie einfach die
removeCallbacks(Runnable r)
Methode.quelle
Die Antwort von Cristian ist korrekt, aber im Gegensatz zu den Kommentaren in der Antwort können Sie Rückrufe für anonyme
Runnables
Anrufe entfernenremoveCallbacksAndMessages(null);
Wie hier angegeben :
quelle
Handler
oder einerView
Klasse zu tun haben . In einerView
Klasse (und möglicherweise nach 4.0?) Müssen Sie dasselbeRunnable
Objekt verwenden, um die Aufgabe abzubrechen, während bei einerHandler
Klasse einfach alle abgebrochen werden, wenn Sie bestehennull
. Die Frage gibt jedoch a an,Handler
sodass Ihre Antwort korrekt ist.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öchten (dh im Fall von OP entfernen Sie einfach die Schließen-Animation und lassen 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 führt nur "r3" und dann nur "r4" aus. Auf diese Weise können Sie eine bestimmte Kategorie von Runnables entfernen, die von Ihrem Token definiert wurden, ohne Verweise auf die Runnables selbst enthalten zu müssen.
Hinweis: Der Quellcode vergleicht Token nur mit dem Operanden "==" (er ruft nicht .equals () auf). Verwenden Sie daher am besten Ints / Integer anstelle von Zeichenfolgen für das Token.
quelle
string
zu gewechseltint
und hatte dann einen Tag lang diesen Fehler: D stackoverflow.com/q/62405834/2736039Wenn Sie eine 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 einer Textansicht (Timer) jede Sekunde heruntergezählt. Sobald 0 erreicht ist, wird die Textansicht von der Benutzeroberfläche entfernt und der Countdown deaktiviert. Dies ist nur für jemanden nützlich, der Rekursion verwendet, aber ich bin hier angekommen, um danach zu suchen, also veröffentliche ich meine Ergebnisse.
quelle