Comment supprimer un object exécutable d’un object gestionnaire ajouté par postDelayed?

J’ai une animation “ouverte” et Handler.postDelayed(Runnable, delay) pour déclencher une animation “close” après un court délai. Cependant, entre l’ouverture et la fermeture, il y a peut-être une autre animation déclenchée par un clic.

Ma question est la suivante: comment puis-je annuler l’animation “close” dans le gestionnaire?

Il suffit d’utiliser la removeCallbacks(Runnable r) .

La réponse de Cristian est correcte, mais contrairement à ce qui est indiqué dans les commentaires de la réponse, vous pouvez en fait supprimer les rappels pour les Runnables anonymes en appelant removeCallbacksAndMessages(null);

Comme indiqué ici :

Supprimez tous les messages en attente de rappels et les messages envoyés dont l’object est un jeton. Si le jeton est nul, tous les rappels et messages seront supprimés .

C’est une réponse tardive, mais voici une méthode différente lorsque vous souhaitez uniquement supprimer une catégorie spécifique de fichiers exécutables du gestionnaire (par exemple, dans le cas de l’OP, supprimez simplement l’animation fermée, en laissant les autres éléments dans la queue):

  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); 

Le code ci-dessus exécutera “r3” puis “r4” seulement. Cela vous permet de supprimer une catégorie spécifique d’exécutables définis par votre jeton, sans avoir à contenir de références aux exécutables eux-mêmes.

Remarque: le code source compare uniquement les jetons utilisant l’opérande “==” (il n’appelle pas .equals ()), il est donc préférable d’utiliser ints / Integers au lieu de chaînes pour le jeton.

Si vous utilisez la récursivité, vous pouvez y parvenir en passant “this”. Voir le code ci-dessous.

 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); } 

Cet exemple définit le texte d'un TextView (timer) chaque seconde, en comptant. Une fois arrivé à 0, il supprimera le TextView de l'interface utilisateur et désactivera le compte à rebours. Ceci n'est utile que pour ceux qui utilisent la récursivité, mais je suis arrivé ici en le recherchant, alors je publie mes résultats.