Как удалить runnable из объекта обработчика, добавленного postDelayed?

У меня есть анимация "open" , и я использую Handler.postDelayed(Runnable, delay) для запуска анимации "close" после небольшой задержки. Тем не менее, в течение времени между открытием и закрытием, возможно, появляется другая анимация, вызванная щелчком.

Мой вопрос: как бы отменить анимацию "close" в обработчике?

Ответ 2

Ответ Cristian правильный, но в отличие от того, что указано в комментариях к ответам, вы действительно можете удалить обратные вызовы для анонимного Runnables, вызвав removeCallbacksAndMessages(null);

Как указано здесь:

Удалите все ожидающие сообщения обратных вызовов и отправленные сообщения, obj которых является токеном. Если токен равен нулю, все обратные вызовы и сообщения будут удалены.

Ответ 3

Это поздний ответ, но здесь другой метод, когда вы хотите удалить только определенную категорию runnables из обработчика (то есть в случае OP, просто удалите анимацию закрытия, оставив другие runnables в очереди):

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

Вышеприведенный код выполнит "r3", а затем "r4". Это позволяет удалить определенную категорию runnables, определенную вашим токеном, без необходимости хранить ссылки на сами runnables.

Примечание. Исходный код сравнивает токены, используя только операнд "==" (он не вызывает .equals()), поэтому лучше всего использовать ints/integers вместо строк для токена.

Ответ 4

Если вы используете рекурсию, вы можете добиться этого, пройдя "this". См. Код ниже.

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

Этот пример будет устанавливать текст TextView (таймер) каждую секунду, считая вниз. Как только он достигнет 0, он удалит TextView из пользовательского интерфейса и отключит обратный отсчет. Это полезно только для тех, кто использует рекурсию, но я приехал сюда для поиска, поэтому я отправляю свои результаты.

Ответ 5

Если вы хотите удалить обратный вызов для анонимного Runnable, просто запустите: handler = null Все будет удалено.