Handler no entrega un mensaje o un Runnable al subproceso principal

Tengo una aplicación con dos hilos – principal y cargador de datos. Cuando finaliza el cargador de datos, publica un objeto Runnable en el subproceso principal (como se describe en el DevGuide), pero nunca se entrega y se ejecuta.

Aquí está el código básico:

class MyApp extends Application { public void onCreate() { LoaderThread t = new LoaderThread(); t.start(); } private class LoaderThread extends Thread { public void run() { SystemClock.sleep(2000); boolean res = m_handler.post(m_runnable); if(res) Log.d(TAG, "Posted Runnable"); } } private final Handler m_handler = new Handler(); private final Runnable m_runnable = new Runnable() { public void run() { Log.d(TAG, "Hey, i'm runnable!"); } } } 

También es importante tener en cuenta que ejecuté este código como una unidad de prueba derivada de un ApplicationTestCase:

 class MyAppTest : public ApplicationTestCase { public MyAppTest() { super(MyApp.class); } public void testLoading() { createApplication(); // few asserts follow here... } } 

Así que esto falla. Runnable nunca se ejecuta () llamado, aunque el registro indica que se ha publicado correctamente. También intenté enviar mensajes simples en lugar de publicar runnable (m_handler.sendEmptyMessage (1) por ejemplo) – nunca se entregan a la devolución de llamada del manejador en el hilo principal.

¿Qué extraño aquí?

Gracias por adelantado 🙂

Un Handler requiere un Looper para poder trabajar. El Looper proporciona una cola de mensajes requerida por el Handler .

Todas las instancias de Activity tienen un Looper como se usa para procesar Eventos de la UI, pero puede crear su instancia de Looper otro lugar.

Eche un vistazo a su salida de registro para ver si Android se queja de la ausencia de un Looper .

Si es así, puede arreglar agregando lo siguiente a la parte superior de su método onCreate() :

 Looper.prepare(); m_handler = new Handler(); Looper.run(); 

Y eliminar la inicialización de m_handler de más adelante en su código.

Handler sólo funciona en una Activity AFAIK. Está intentando utilizarlo en una Application .

Una alternativa a llamar a Looper.prepare() es llamar al new Handler(Looper.getMainLooper()) . El problema con llamar Looper.prepare() es que lanzará una excepción cuando ya hay un looper en su hilo. Lo más probable es que usted está escribiendo código que tiene que ejecutarse en diferentes entornos y esta solución se encargará de más casos.

Consulte: Error AsyncTask y Looper.prepare ()

  • Hacer un hilo que cancela una llamada de InputStream.read () si ha pasado el tiempo 'x'
  • Android Looper y pila de llamadas
  • Corrección multihilo: Utilización de bloqueo sincronizado
  • ¿El límite de los hilos en android?
  • ¿Cómo ejecutar la solicitud web en su propio hilo?
  • Acceso a vistas desde otro hilo (Android)
  • ¿Necesitamos usar el hilo de fondo para recuperar datos usando firebase?
  • Espere a que los hilos se completen antes de continuar
  • Cómo solucionar el problema de las llamadas de la biblioteca NDK que congela el subproceso de la interfaz de usuario
  • Descargar el archivo hace que la interfaz de usuario gague
  • Cómo pausar / dormir hilo o proceso en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.