¿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 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 .

  • Android: ¿Dejar de usar Looper?
  • Android: mensajes de Handler retrasados ​​al final del hilo de trabajo
  • Android hilo problema, ¿por qué ui todavía bloquea cuando he utilizado un hilo de trabajo?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.