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


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

мой вопрос в том, как бы я отменил "закрыть" анимация в обработчике?

4 63

4 ответа:

просто использовать removeCallbacks(Runnable r) метод.

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

Как заявил здесь:

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

это поздний ответ, но вот другой метод, когда вы хотите удалить только определенную категорию 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 вместо строк для токена.

Если вы используете рекурсию, вы можете достичь этого, передав "это". Смотрите код ниже.

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 из пользовательского интерфейса и отключит обратный отсчет. Это полезно только для тех, кто использует рекурсию, но я прибыл сюда в поисках этого, поэтому я публикую свои результаты.