Manejadores inicializados con Looper.getMainLooper () no responde a callbacks de mensaje

Estoy tratando de implementar Handlers escuchar en el mismo Looper de diferentes hilos.

A continuación tengo dos Handlers, uno creado en el hilo principal, otro en el hilo hijo, sin embargo ambos se inicializan para escuchar en el Looper principal.

private Handler mMain; public static final ThreadPoolExecutor tpe = (ThreadPoolExecutor) Executors.newCachedThreadPool(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mMain = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { Log.wtf("", "main:" + msg); } }; tpe.execute(new Runnable() { private Handler tChild = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { Log.wtf("", "child:" + msg); } }; @Override public void run() { Log.wtf("", "send msg to main looper"); tChild.sendEmptyMessage(100); } }); } 

Pero cuando envío un mensaje como a continuación, sólo el controlador de niños imprime el mensaje. El controlador principal no recibe el mensaje.

 03-20 22:02:26.754: A/(12857): send msg to main looper 03-20 22:02:26.847: A/(12857): child:{ what=100 when=-8ms } 

¿Qué estoy haciendo mal? Gracias por leer.

Cada instancia de Handler controla el destino de Message y no hay manera de que se compartan, por lo que cada mensaje o mensaje enviado a un Handler sólo se ejecuta por esa instancia.

El Looper indica en qué subproceso se ejecutarán los mensajes / ejecutables enviados. En su código, ambos manejadores ejecutaran handleMessage() en el subproceso principal, a pesar de ser creados en subprocesos separados. Esa es la verdadera razón por la que puede pasar una instancia de Looper a un Handler … si no pasa Looper , entonces el Handler ejecutará código en el subproceso en el que se creó (que también debe ser un hilo Looper ).

Además, debido a esto no hay razón para crear múltiples manejadores para enviar datos de esta manera. Un Handler único está diseñado para enviar mensajes de varios subprocesos, y todos ellos se serializan en un MessageQueue y se ejecutan en el hilo Looper elegido. Puede publicar directamente en mMain desde el subproceso de fondo para ejecutar código en ese subproceso. En este caso, pasar el Looper es redundante en ese código ya está en el hilo principal.

Los mensajes enviados a un Handler solo serán manejados por ese Handler , aunque esté compartiendo un Looper .

Enterrado en el código fuente de Handler es la línea

 msg.target = this; 

Esto garantiza que ningún otro Handler lo toque.

  • ¿Debería un MediaPlayer ejecutarse en hilos separados?
  • Cómo establecer la prioridad de IntentService en Android
  • ¿Por qué utilizar AsyncTaskLoader con LoaderManager, en lugar de Simple Handler?
  • IllegalArgumentException en StatFs en WebViewCore thread interno
  • Conversión entre mensaje y cadena en android?
  • ¿Los hilos son lo suficientemente fiables para calcular segundos?
  • ¿Cuál es la forma correcta de iniciar una comunicación de red basada en recibir una intención de difusión?
  • ¿Puedo bloquear una tabla SQLite para el subproceso actual?
  • Problema de hilo simple con la animación de Android
  • ¿Cuál es la diferencia entre un hilo y un manejador
  • Asyntask: ¿por qué actualizar el hilo de la interfaz de usuario en doInbackground se encontrará con el error?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.