Как удалить runnable из объекта-обработчика, добавленного postDelayed? - PullRequest
63 голосов
/ 02 сентября 2010

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

У меня вопрос, как бы я отменил анимацию "close" в обработчике?

Ответы [ 4 ]

90 голосов
/ 02 сентября 2010

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

87 голосов
/ 10 февраля 2013

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

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

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

13 голосов
/ 18 июня 2015

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

    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 ()), поэтому лучше использовать целые числа / целые числа вместо строк для токена.

10 голосов
/ 24 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...