Question

Je "ouvert" animation et je utilise Handler.postDelayed(Runnable, delay) pour déclencher une "close" animation après un court délai. Cependant, pendant le temps entre 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 le "close" animation dans le gestionnaire?

Était-ce utile?

La solution

Il suffit d'utiliser le removeCallbacks(Runnable r) méthode.

Autres conseils

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 callbacks pour Runnables anonyme en appelant removeCallbacksAndMessages(null);

Comme indiqué :

  

Retirez tous les messages en attente de callbacks et les messages envoyés dont obj est symbolique. Si jeton est nul, tous les callbacks et les messages seront supprimés .

Ceci est une réponse tardive, mais voici une autre méthode quand vous voulez seulement supprimer une catégorie spécifique de runnables du gestionnaire (par exemple dans le cas de l'OP, il suffit de retirer l'animation à proximité, en laissant d'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 » seulement. Cela vous permet de supprimer une catégorie spécifique de runnables définies par votre jeton, sans avoir besoin de tenir des références aux runnables eux-mêmes.

Note: le code source compare jetons en utilisant les « == » opérande uniquement (il ne remet pas equals ()), donc il vaut mieux utiliser ints / Entiers au lieu de chaînes pour le jeton.

Si votre utilisation de récursivité, vous pouvez acheive cela en passant « ce ». 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 (minuterie) chaque seconde, compte à rebours. Une fois qu'il arrive à 0, il supprimera le la TextView de l'interface utilisateur et désactiver le compte à rebours. Ceci est seulement utile pour quelqu'un qui utilise récursion, mais je suis arrivé ici pour la recherche, donc je vais poster mes résultats.

Si vous voulez supprimer la fonction de rappel pour un Runnable anonyme il suffit d'exécuter: handler = null Tout sera supprimé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top