Come rimuovere un eseguibile da un oggetto gestore inserito da postDelayed?
-
26-09-2019 - |
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?
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.