web-dev-qa-db-fra.com

annuler un processus handler.postdelayed

J'utilise handler.postDelayed() pour créer une période d'attente avant la prochaine étape de mon application. Pendant la période d'attente, j'affiche une boîte de dialogue avec une barre de progression et le bouton cancel .

Mon problème est que je ne trouve pas de moyen pour annuler la tâche postDelayed avant le temps imparti.

228
Ron

Je fais ceci pour poster un runnable retardé:

myHandler.postDelayed(myRunnable, SPLASH_DISPLAY_LENGTH); 

Et ceci pour le supprimer: myHandler.removeCallbacks(myRunnable);

438
Varun

Une autre façon est de gérer le Runnable lui-même:

Runnable r = new Runnable {
    public void run() {
        if (booleanCancelMember != false) {
            //do what you need
        }
    }
}
17
codeScriber

Cela a fonctionné pour moi lorsque j’ai appelé CancelCallBacks (this) à l’intérieur de la publication exécutable en le remettant via un booléen

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);
        }
    }
};
0
Ramin Fallahzadeh

Voici une classe fournissant une méthode d'annulation pour une action retardée

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);
}}
0
Stéphane Padovani