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

StackOverflow https://stackoverflow.com/questions/3627216

Вопрос

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

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

Это было полезно?

Решение

Просто используйте removeCallbacks(Runnable r) метод.

Другие советы

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

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

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

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

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

Примечание. Исходный код сравнивает токены, используя только операнду «==» (только он не вызывает .equals ()), настолько наилучшим образом использовать INTS / целые числа вместо строк для токена.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top