Tengo un controlador de mi sub-actividad que fue llamado por la actividad principal . Las subclases utilizan este postDelaycontrolador para algunos Runnables, y no puedo administrarlos. Ahora, en el onStopcaso, 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
Runnableinstancia específica , llameHandler.removeCallbacks(). Tenga en cuenta que usa laRunnableinstancia 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 exactaRunnablepara 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
MessageQueuepara unHandler, incluso si realiza una solicitud para elMessageQueueobjeto 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 unaHandlersubclase delgada para administrar una lista deRunnablecorreos 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
Handlery unRunnablealcance 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 Handlerenew Runnableinstancias. 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
ActivityoFragmentlo que usas" .fuente
Como se
josh527dijo,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