У меня есть обработчик из моего подкласса, который был вызван основным делом . Этот обработчик используется подклассами для postDelay
некоторых Runnables, и я не могу ими управлять. Теперь, в onStop
случае, мне нужно удалить их перед завершением Деятельности (как-то я звонил finish()
, но он все равно звонил снова и снова). Есть ли способ удалить все обратные вызовы из обработчика?
java
android
callback
android-handler
Люк Во
источник
источник
removeCallbacksAndMessages(null)
, не удалял некоторые из моих обратных вызовов. Когда я хотел бы прекратить получатьhandler.removeCallbacksAndMessages(null)
обратные вызовы, я звонил и устанавливал свой обработчик на ноль, но, так как я все еще получал обратный вызов, я столкнулся бы с NPE, когда захотел бы выполнить циклhandler.postDelayed()
.yourHandler.removeCallbacks(yourRunnable)
было самым надежным. Все еще использую это сегодня.Для любого конкретного
Runnable
случая звонитеHandler.removeCallbacks()
. Обратите внимание, что он использует самRunnable
экземпляр, чтобы определить, какие обратные вызовы необходимо отменить, поэтому, если вы создаете новый экземпляр каждый раз, когда создается сообщение, вам необходимо убедиться, что у вас есть ссылки на точнуюRunnable
отмену. Пример:Вы можете позвонить,
myHandler.postDelayed(myRunnable, x)
чтобы отправить еще один обратный вызов в очередь сообщений в других местах вашего кода, и удалить все ожидающие обратные вызовы с помощьюmyHandler.removeCallbacks(myRunnable)
К сожалению, вы не можете просто «очистить» все
MessageQueue
для aHandler
, даже если вы делаете запрос дляMessageQueue
объекта, связанного с ним, потому что методы добавления и удаления элементов защищены пакетами (их могут вызывать только классы в пакете android.os). Возможно, вам придется создать тонкийHandler
подкласс, чтобы управлять списком объектов,Runnable
когда они публикуются / выполняются ... или искать другую парадигму для передачи ваших сообщений между каждымActivity
Надеюсь, это поможет!
источник
Если у вас нет ссылок Runnable, при первом обратном вызове получите объект сообщения и используйте removeCallbacksAndMessages () для удаления всех связанных обратных вызовов.
источник
Определите новый обработчик и работоспособный:
Звонок отложен:
Удалите ваш обратный вызов из вашего обработчика:
источник
Обратите внимание, что нужно определить a
Handler
и aRunnable
в области видимости класса, чтобы он создавался один раз.removeCallbacks(Runnable)
работает правильно, если не определить их несколько раз. Пожалуйста, посмотрите на следующие примеры для лучшего понимания:Неверный путь:
Если вы вызываете
onClick(..)
метод, вы никогда не прекращаетеdoIt()
вызов метода до его вызова. Потому что каждый раз создаетnew Handler
иnew Runnable
экземпляры. Таким образом, вы потеряли необходимые ссылки, которые принадлежат обработчикам и запускаемым экземплярам.Правильный путь :
Таким образом, вы не потеряете реальные ссылки и
removeCallbacks(runnable)
успешно работаете.Ключевое предложение заключается в том, что «определите их как глобальные в вашем
Activity
или вFragment
том, что вы используете» .источник
Как
josh527
сказано,handler.removeCallbacksAndMessages(null);
может работать.Но почему?
Если вы посмотрите на исходный код, вы сможете понять его более четко. Существует 3 типа методов для удаления обратных вызовов / сообщений из обработчика (MessageQueue):
Handler.java (оставьте метод перегрузки)
MessageQueue.java делает реальную работу:
источник