2012-10-12 165 views
21

¿Hay alguna forma de que Android sepa si el subproceso que ejecuta mi código es el subproceso UI o no? En swing hubo SwingUtilities.isEventDispatchThread() para decirme si estoy en el hilo UI, o no. ¿Hay alguna función en el SDK de Android que me permita saber esto?Cómo saber si este hilo es un subproceso de interfaz de usuario

+1

¿Por qué necesita saber en qué hilo se ejecuta su código?Si está destinado para el hilo de UI, simplemente envíelo allí. –

+0

generalmente sabe cuándo se está ejecutando un método en el hilo de la interfaz de usuario. ¿Hay algún caso en particular en el que tengas una duda? – njzk2

+0

Ningún caso en particular. Solo una forma de asegurar mi código multihilo. – user1730789

Respuesta

39
  1. respuesta tomado de aquí: How to check if current thread is not main thread

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

  2. cualquier aplicación de Android tiene sólo un hilo de interfaz de usuario, por lo que podría en algún lugar de la devolución de llamada actividad como onCreate() comprobar y almacenar su ID y más tarde simplemente compare el ID de ese hilo con el almacenado.

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

  3. De todos modos, se puede omitir la comprobación si quieres hacer algo en el hilo de interfaz de usuario y tener cualquier referencia a la actividad mediante el uso de

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

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

0

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

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

Entonces, ¿qué hacer?

  • Cuando tiene que hacer cálculos pesados ​​en su actividad; Una solución es usar AsyncTask (una clase diseñada para permitirle usar fácilmente otro hilo). El código en onExecute() se ejecuta en otro hilo (pero tenga cuidado con postExecute ejecuta en su hilo principal). Otro es iniciar manualmente un nuevo hilo cuando AsyncTask no está realmente adaptado.
  • Si crea un servicio que hace tareas de fondo costosas, hágalo ejecutar en otro hilo con el atributo android: process = ": my_process" del manifiesto. Tendrá que crear un AIDL para comunicarse con este servicio separado, pero no es una tarea complicada.
  • Muchos objetos, como por ejemplo MediaPlayer, tienen variaciones Async de sus métodos. Intenta siempre usarlos.
-1

Ponga un punto de interrupción donde quiera verificar y, cuando reciba un golpe, 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 se encuentra en el subproceso UI, de lo contrario, se encuentra en un hilo de fondo.

8

Sí, hay una manera. Comprueba el objeto de la hebra actual contra el objeto de hebra del lopper principal. Looper principal siempre está en el hilo de UI.

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