studio programacion móviles interfaz grafica ejemplos desarrollo curso aplicaciones java android ui-thread

programacion - interfaz grafica java swing pdf



Cómo saber si este hilo es un hilo de interfaz de usuario (4)

¿Hay alguna forma en Android de saber si el hilo que ejecuta mi código es el hilo de la interfaz de usuario o no? En swing había SwingUtilities.isEventDispatchThread() para decirme si estoy en el hilo de UI, o no. ¿Hay alguna función en el SDK de Android que me permita saber esto?


  1. Respuesta prestada desde aquí: Cómo verificar si el hilo actual no es el hilo principal

    Looper.myLooper() == Looper.getMainLooper()

  2. Cualquier aplicación de Android tiene solo un subproceso de la interfaz de usuario, por lo que en algún lugar de la actividad de devolución de llamada como onCreate () verifique y almacene su ID y luego compare el ID de ese hilo con el almacenado.

    mMainThreadId = Thread.currentThread().getId();

  3. De todos modos, puede omitir la verificación si desea hacer algo en el subproceso de la interfaz de usuario y tiene alguna referencia a la Actividad usando

    mActivity.runOnUiThread( new Runnable() { @Override public void run() { ... } });

que está garantizado para ejecutarse en el hilo actual, si es UI, o en cola en el hilo de UI.


Coloque un punto de interrupción donde desee verificar y, cuando se golpee, verifique si puede interactuar con su UI (es decir, si la IU no está congelada). Si no puede interactuar con la interfaz de usuario, entonces está en el subproceso de la interfaz de usuario, de lo contrario, está en un subproceso de fondo.


Hum en realidad debido a la arquitectura de Android, todas las Actividades se ejecutan en el subproceso principal, es decir, el subproceso de la interfaz de usuario. Entonces, cuando está codificando una actividad, todo lo que está en su actividad está en el hilo de la interfaz de usuario.
Es por eso que en Honeycomb se ha agregado un error al realizar llamadas de red en el hilo principal: bloquea totalmente la IU.

Entonces, de forma predeterminada, de hecho, siempre estás trabajando en el subproceso de la interfaz de usuario. Otra cosa: a menos que solicite explícitamente que esté en otro hilo, un Servicio operará en el mismo hilo que las actividades de su aplicación.

Entonces lo que hay que hacer ?

  • Cuando tienes que hacer un cálculo pesado en tu actividad; una solución es usar una AsyncTask (una clase diseñada para permitirle usar fácilmente otro hilo). El código en onExecute () se ejecuta en otro hilo (pero ten cuidado, postExecute se ejecuta en tu hilo principal). Otra es comenzar manualmente un nuevo hilo cuando AsyncTask no está realmente adaptado.
  • Si crea un servicio que realiza tareas costosas en segundo plano, hágalo funcionar en otro hilo con el atributo android: process = ": my_process" del manifiesto. Necesitará crear una AIDL para comunicarse con este servicio separado, pero no es una tarea complicada.
  • Muchos objetos, como por ejemplo el MediaPlayer, tienen variaciones asíncronas de sus métodos. Trate de usarlos siempre.

Sí, hay una manera. Compruebe el objeto de hilo actual contra el objeto de hilo principal de lopper. Looper principal está siempre en el hilo de la interfaz de usuario.

boolean isOnUiThread = Thread.currentThread() == Looper.getMainLooper().getThread();