Подтвердить что ты не робот

Как отменить handler.postDelayed?

Что делать, если у меня уже есть поток handler.postDelayed, и мне нужно его отменить?

4b9b3361

Ответ 1

Я делаю это, чтобы отменить postDelays для Android: removeCallbacks удаляет все ожидающие сообщения Runnable r, которые находятся в очереди сообщений.

handler.removeCallbacks(runnableRunner);

или использовать для удаления всех сообщений и обратных вызовов

handler.removeCallbacksAndMessages(null);

Ответ 2

Если вы не хотите сохранять ссылку на runnable, вы можете просто вызвать:

handler.removeCallbacksAndMessages(null);

В официальной документации говорится:

... Если токен равен нулю, все обратные вызовы и сообщения будут удалены.

Ответ 3

У меня был экземпляр, где мне нужно было отменить postDelayed во время работы, поэтому приведенный выше код не работал для моего примера. То, что я закончил делать, было иметь логическую проверку внутри моего Runnable, поэтому, когда код был выполнен по истечении заданного времени, он либо загорелся, исходя из того, что в то время было логическим значением, и это сработало для меня.

 public static Runnable getCountRunnable() {
    if (countRunnable == null) {
        countRunnable = new Runnable() {
            @Override
            public void run() {
                if (hasCountStopped)
                    getToast("The count has stopped");
            }
        };
    }
    return countRunnable;
}

FYI - в моей работе уничтожить, я использую код, предложенный другими разработчиками, handler.removecallback и handler = null; чтобы отменить ручку, чтобы сохранить код в чистоте и убедиться, что все будет удалено.