¿Cómo eliminar mensajes retrasados antes de llegar a un manejador?
Mi problema es que necesito enviar mensajes con un retardo de 1 segundo. El manejador entonces inicia alguna acción, usted está consiguiendo la imagen.
Sin embargo, hay algunas condiciones en las que el mensaje ya enviado debe ser eliminado (antes de que se haya transcurrido el segundo) para evitar que el manejador haga algo. No pude averiguar cómo hacer esto (o si es posible), así que si alguien de ustedes tiene una pista, por favor avíseme.
- No se puede conectar el Samsung Galaxy Tab2 GT- P3100 al PC
- Cómo llamar a un método después de un retraso en Android
- Pruebas de unidad de Android con múltiples subprocesos
- ¿La clase android.os.Handler elimina la necesidad de declarar ciertos métodos como sincronizados?
- USB debugging - Problema con la instalación de controladores para Epson Moverio
- Controladores de "modo blando" del modo de host USB de Android para dispositivos USB estándar compatibles con la clase
- Realizar cambios en la interfaz de usuario de la actividad principal desde el subproceso en Service
- No es posible que el SDKcontroller de Android funcione
- Android: Hacer la conexión de la aplicación en segundo plano en el arranque
- ¿Qué es el grupo de mensajes globales en Android? ¿Dónde reside en la memoria?
- Handler en Android
- Acceso al controlador de subprocesos de interfaz de usuario desde un servicio
- Problema con la detección de tabletas Synchro Digital
No hay nada de miedo en los métodos removeMessages()
; Son perfectamente seguros. El framework se basa en gran medida en estos métodos y se utilizan en muchos lugares, especialmente en los widgets predeterminados ( View
, ListView
, etc.). Es mucho mejor que construir un Handler
que ignore los mensajes específicos. Esto es la programación, no vayas con tus sentimientos: p
Muchos desarrolladores y gran parte del código fuente que encontrará mostrarán a las personas que pasan funciones anónimas a un controlador, por lo que creo que en algunos casos puede que no sepa cómo eliminarlas. Una solución simple es declarar tu ejecución como lo harías con cualquier otro objeto, y mantener un puntero a él que se puede utilizar para borrar cualquier instancia de él desde la cola del manejador.
private Runnable lastMyRunnablePtr = null;
…
private class MyRunnable implements Runnable {}
….
lastMyRunnablePtr = new MyRunnable(); mHandler.postDelayed(lastMyRunnablePtr ,30000);
….
protected void onDestroy() { mHandler.removeCallbacks(lastMyRunnablePtr); }
En realidad, debe considerar la implementación de handler.removeMessages(int, obj)
. Si el obj es un objeto relacionado con autoboxing, se encontrará con un problema de la implementación de android MessageQueue
.
Para el siguiente fragmento de código, removeMessages no funcionará como resultado de auto-boxing, boxing-conversion y la implementación de MessageQueue usando p.obj == objeto para comparar el objeto.
Message msg = handler.obtainMessage(what, 256); handler.sendMessageDelayed(message, delayMillis); handler.removeMessages(what, 256);
Ref. Este post .