Tengo un controlador de mi sub-actividad que fue llamado por la actividad principal . Las subclases utilizan este postDelay
controlador para algunos Runnables, y no puedo administrarlos. Ahora, en el onStop
caso, necesito eliminarlos antes de terminar la Actividad (de alguna manera llamé finish()
, pero todavía llama una y otra vez). ¿Hay alguna forma de eliminar todas las devoluciones de llamada de un controlador?
java
android
callback
android-handler
Luke Vo
fuente
fuente
removeCallbacksAndMessages(null)
no eliminar algunas de mis devoluciones de llamada. Cuando quisiera dejar de recibir devoluciones de llamada, llamaríahandler.removeCallbacksAndMessages(null)
y establecería mi controlador en nulo, pero como todavía recibiría la devolución de llamada, me encontraría con un NPE cuando quisiera hacer un buclehandler.postDelayed()
.yourHandler.removeCallbacks(yourRunnable)
era lo más confiable. Sigo usando eso hoy.Para cualquier
Runnable
instancia específica , llameHandler.removeCallbacks()
. Tenga en cuenta que usa laRunnable
instancia en sí para determinar qué devoluciones de llamada se deben anular, por lo que si está creando una nueva instancia cada vez que se realiza una publicación, debe asegurarse de tener referencias a la exactaRunnable
para cancelar. Ejemplo:Puede llamar
myHandler.postDelayed(myRunnable, x)
para publicar otra devolución de llamada en la cola de mensajes en otros lugares de su código y eliminar todas las devoluciones de llamada pendientes conmyHandler.removeCallbacks(myRunnable)
Desafortunadamente, no puede simplemente "borrar" todo
MessageQueue
para unHandler
, incluso si realiza una solicitud para elMessageQueue
objeto asociado con él porque los métodos para agregar y eliminar elementos están protegidos por el paquete (solo las clases dentro del paquete android.os pueden llamarlos). Puede que tenga que crear unaHandler
subclase delgada para administrar una lista deRunnable
correos electrónicos a medida que se publican / ejecutan ... o mire otro paradigma para pasar sus mensajes entre cadaActivity
¡Espero que ayude!
fuente
Si no tiene las referencias Runnable, en la primera devolución de llamada, obtenga el obj del mensaje y use removeCallbacksAndMessages () para eliminar todas las devoluciones de llamada relacionadas.
fuente
Definir un nuevo controlador y ejecutable:
Mensaje de llamada retrasado:
Elimine su devolución de llamada de su controlador:
fuente
Tenga en cuenta que uno debe definir un
Handler
y unRunnable
alcance en clase, para que se cree una vez.removeCallbacks(Runnable)
funciona correctamente a menos que uno los defina varias veces. Mire los siguientes ejemplos para una mejor comprensión:Forma incorrecta:
Si llama al
onClick(..)
método, nunca deja dedoIt()
llamar al método antes de que llame. Porque cada vez creanew Handler
enew Runnable
instancias. De esta manera, usted perdió las referencias necesarias que pertenecen al manejador y ejecutables casos.Forma correcta:
De esta manera, no pierde referencias reales y
removeCallbacks(runnable)
funciona con éxito.La oración clave es que "defínalos como globales en tu
Activity
oFragment
lo que usas" .fuente
Como se
josh527
dijo,handler.removeCallbacksAndMessages(null);
puede funcionar.¿Pero por qué?
Si echas un vistazo al código fuente, puedes entenderlo más claramente. Hay 3 tipos de métodos para eliminar devoluciones de llamadas / mensajes del controlador (MessageQueue):
Handler.java (deje algún método de sobrecarga)
MessageQueue.java hace el trabajo real:
fuente