Что делать, если у меня уже есть поток handler.postDelayed
, и мне нужно его отменить?
Как отменить handler.postDelayed?
Ответ 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; чтобы отменить ручку, чтобы сохранить код в чистоте и убедиться, что все будет удалено.