Как удалить Runnable из объекта обработчика, добавленного PostDelayed?
-
26-09-2019 - |
Вопрос
у меня есть "открытым" анимация и я использую 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
Все будет удалено.