У меня есть обработчик из моего подактива, который был вызван основным действием. Этот обработчик используется подклассами для postDelay некоторых исполняемых файлов, и я не могу ими управлять. Теперь, в onStop событии, мне нужно удалить их перед завершением действия (каким-то образом я вызвал finish(), но он все равно вызывается снова и снова). Есть ли способ удалить все обратные вызовы из обработчика?
Переведено автоматически
Ответ 1
По моему опыту, вызов этого отлично сработал!
handler.removeCallbacksAndMessages(null);
В документации для removeCallbacksAndMessages сказано...
Удалите все ожидающие публикации обратных вызовов и отправленных сообщений, объектом которых является токен. Если токен равен null, все обратные вызовы и сообщения будут удалены.
Ответ 2
Для любого конкретного Runnable экземпляра вызывайте Handler.removeCallbacks(). Обратите внимание, что он использует сам Runnable экземпляр, чтобы определить, какие обратные вызовы отменить регистрацию, поэтому, если вы создаете новый экземпляр каждый раз, когда выполняется публикация, вам нужно убедиться, что у вас есть ссылки на точные Runnable для отмены. Пример:
Вы можете вызвать myHandler.postDelayed(myRunnable, x), чтобы отправить другой обратный вызов в очередь сообщений в других местах вашего кода, и удалить все ожидающие обратные вызовы с помощью myHandler.removeCallbacks(myRunnable)
К сожалению, вы не можете просто "очистить" весь MessageQueue для Handler, даже если вы делаете запрос для MessageQueue объекта, связанного с ним, потому что методы добавления и удаления элементов защищены пакетом (их могут вызывать только классы в пакете android.os). Возможно, вам придется создать тонкий Handler подкласс для управления списком Runnableобъектов по мере их публикации / выполнения ... или посмотрите на другую парадигму передачи ваших сообщений между каждым Activity
Надеюсь, это поможет!
Ответ 3
Определите новый обработчик и runnable:
privateHandlerhandler=newHandler(Looper.getMainLooper()); privateRunnablerunnable=newRunnable() { @Override publicvoidrun() { // Do what ever you want } };
Задержка отправки вызова:
handler.postDelayed(runnable, sleep_time);
Удалите обратный вызов из вашего обработчика:
handler.removeCallbacks(runnable);
Ответ 4
Пожалуйста, обратите внимание, что следует определить a Handler и a Runnable в области видимости класса, чтобы он создавался один раз.removeCallbacks(Runnable) работает корректно, если не определять их несколько раз. Пожалуйста, посмотрите на следующие примеры для лучшего понимания:
Если вы вызываете onClick(..) метод, вы никогда не останавливаете doIt() вызов метода перед его вызовом. Потому что каждый раз создаются экземпляры new Handler и new Runnable. Таким образом, вы потеряли необходимые ссылки, которые принадлежат экземплярам handler и runnable.