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.

È stato utile?

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

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.

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