annullare un processo handler.postdelayed
-
09-10-2019 - |
Domanda
Sto usando handler.postDelayed()
per creare un periodo di attesa prima della prossima fase della mia app avviene. Durante il periodo di attesa che sono la visualizzazione di una finestra di dialogo con barra di avanzamento e Annulla .
Il mio problema è che non riesco a trovare un modo per annullare l'postDelayed compito che le è trascorso del tempo.
Soluzione
Lo faccio per pubblicare un ritardo eseguibile:
myHandler.postDelayed(myRunnable, SPLASH_DISPLAY_LENGTH);
E questo per rimuoverla: myHandler.removeCallbacks(myRunnable);
Altri suggerimenti
Nel caso in cui non dispone di più runnables interne / anonimi passati al stesso gestore, e si desidera annullare tutti allo stesso uso evento
handler.removeCallbacksAndMessages(null);
Come per la documentazione,
Rimuovere eventuali messaggi in attesa di callback e messaggi inviati cui obj è gettone. Se token è nullo, verranno rimosse tutte le richiamate e messaggi.
Un altro modo è quello di gestire il Runnable stesso:
Runnable r = new Runnable {
public void run() {
if (booleanCancelMember != false) {
//do what you need
}
}
}
Ha funzionato per me quando ho chiamato CancelCallBacks (questo) vicino al palo più ritardato eseguibile da consegnare tramite un valore booleano
Runnable runnable = new Runnable(){
@Override
public void run() {
Log.e("HANDLER", "run: Outside Runnable");
if (IsRecording) {
Log.e("HANDLER", "run: Runnable");
handler.postDelayed(this, 2000);
}else{
handler.removeCallbacks(this);
}
}
};
Ecco una classe che fornisce un metodo di annullamento per un'azione ritardata ??p>
public class DelayedAction {
private Handler _handler;
private Runnable _runnable;
/**
* Constructor
* @param runnable The runnable
* @param delay The delay (in milli sec) to wait before running the runnable
*/
public DelayedAction(Runnable runnable, long delay) {
_handler = new Handler(Looper.getMainLooper());
_runnable = runnable;
_handler.postDelayed(_runnable, delay);
}
/**
* Cancel a runnable
*/
public void cancel() {
if ( _handler == null || _runnable == null ) {
return;
}
_handler.removeCallbacks(_runnable);
}}
Spero che questo succo di aiuto https://gist.github.com/imammubin/a587192982ff8db221da14d094df6fb4
MainActivity come schermata di avvio con gestore e la funzione eseguibile, la corsa Runnable alla pagina di login o una pagina di avanzamento con l'utente preferenza base di login con Firebase.