web-dev-qa-db-fra.com

Comment supprimer un exécutable d'un objet gestionnaire ajouté par postDelayed?

J'ai une animation "open" et j'utilise Handler.postDelayed(Runnable, delay) pour déclencher une animation "close" après un court délai. Cependant, pendant le temps entre l'ouverture et la fermeture, il y a peut-être une autre animation déclenchée par un clic.

Ma question est, comment pourrais-je annuler l'animation "close" dans le gestionnaire?

64
Bruce Lee

Utilisez simplement la méthode removeCallbacks(Runnable r) .

91
Cristian

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

Comme indiqué ici :

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

88
Daniel L.

Il s'agit d'une réponse tardive, mais voici une méthode différente lorsque vous souhaitez uniquement supprimer une catégorie spécifique de runnables du gestionnaire (c'est-à-dire dans le cas de OP, supprimez simplement l'animation de fermeture, en laissant les autres runnables dans la file d'attente):

    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" uniquement. Cela vous permet de supprimer une catégorie spécifique de runnables définie par votre jeton, sans avoir besoin de conserver des références aux runnables elles-mêmes.

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

16
NameSpace

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éfinira le texte d'un TextView (timer) toutes les secondes, en comptant à rebours. Une fois arrivé à 0, il supprimera le TextView de l'interface utilisateur et désactivera le compte à rebours. Cela n'est utile que pour quelqu'un qui utilise la récursivité, mais je suis arrivé ici à la recherche de cela, donc je publie mes résultats.

10
robisaks

Si vous souhaitez supprimer le rappel d'un Runnable anonyme, lancez simplement: handler = null Tout sera supprimé.

0
Karol Wasowski