2010-12-07 3 views
199

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 un dialogue avec la barre de progression et bouton d'annulation.annulation d'un processus handler.postdelay

Mon problème est que je ne peux pas trouver un moyen de annuler la tâche postDelayed avant que le temps ne s'écoule.

+0

duplication possible de [Comment supprimer un exécutable d'un objet gestionnaire ajouté par postDelayed?] (Http://stackoverflow.com/questions/3627216/how-to-remove-a-runnable-from-a- handler-object-added-by-postdelayed) – sschuberth

Répondre

399

Je le fais pour poster un retard runnable:

myHandler.postDelayed(myRunnable, SPLASH_DISPLAY_LENGTH); 

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

+60

Si vous pouvez vous permettre d'annuler tous les rappels et messages sur le gestionnaire et que vous ne voulez pas conserver de références à la version exécutable, le troisième point de la réponse acceptée à cette question est une autre alternative cela semble fonctionner pour mon cas de toute façon: http://stackoverflow.com/questions/11299440/onbackpressed-to-kill-a-handler-within-an-activity-android (appelant essentiellement myHandler.removeCallbacksAndMessages (null);) – Mick

+0

removeCallbacksAndMessages peut faire l'affaire, mais personnellement, je préfère avoir le contrôle sur les exécutables planifiés. L'instanciation et la gestion d'une paire de Runnables ne vous tueront pas; Sinon, si vous avez besoin de plus de deux ou trois Runnables, vous aurez peut-être besoin de quelque chose de plus puissant, à mon humble avis. –

14

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 
     } 
    } 
} 
+14

booleanCancelMember ne devrait pas être final, ce qui signifie qu'il ne peut pas être modifié et donc inutile à cette fin? – stealthcopter

+8

@stealthcopter non ce n'est pas obligatoire. –

+0

Si vous rendez le Runnable anonyme – pablisco

1

Il a travaillé pour moi quand j'ai appelé CancelCallBacks (this) à l'intérieur du post runnable retardé en le transmettant 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

Il n'y a pas de "CancelCallBacks" dans votre code. Peut-être parce que ça n'existe pas? :) –

12

Si vous avez runnables plusieurs internes/anonymes transmises au même gestionnaire, et que vous voulez annuler tout au même événement utiliser

handler.removeCallbacksAndMessages(null);

Selon la documentation,

Supprimer tous les messages en attente de rappels et les messages envoyés dont l'obj est jeton. Si token est null, tous les rappels et messages seront supprimés.