2009-12-04 15 views

Respuesta

8

Parece que no hay un método para eso en el SDK. El cheque está en la clase ViewRoot y se hace comparando Thread.currentThread() con un miembro de la clase asignado en el constructor pero nunca expuesto.

Si realmente necesita este comprobar que tiene varias opciones para ponerla en práctica:

  1. pesca del android.view.ViewRoot $ CalledFromWrongThreadException
  2. post un Runnable a una vista y comprobar Thread.currentThread()
  3. uso de una Handler para hacer lo mismo

En general, creo que en lugar de comprobando si está en el hilo correcto, debe simplemente asegúrese de que el código siempre se ejecuta en el hilo de la interfaz de usuario (usando 2. o 3.).

+0

+1 por (3) Will

104

Utilice Looper.getMainLooper(). GetThread() para obtener el subproceso de interfaz de usuario. Puede comprobar si es el hilo actual utilizando la siguiente expresión:

Looper.getMainLooper().getThread() == Thread.currentThread() 
+6

Por razones de claridad, la comprobación real que puede hacer es: (Looper.getMainLooper(). GetThread() == Thread.currentThread()) – greg7gkb

+0

Este elemento necesita más amor, muchas gracias – Inverce

9

También puede utilizar runOnUiThread, que sólo requiere un ejecutable que se ejecutará en el hilo de interfaz de usuario

+7

Puede valer la pena señalar que si llama runOnUiThread desde el hilo de UI, el código se ejecutará en línea con el resto de su código. – stork

+0

Esto no responde a la pregunta, que trata de identificar el hilo de UI, no de ejecutar código en él. – CJBS

76

Es hilo de interfaz de usuario si:

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

fuente código fuente AOSP: ManagedEGLContext.java#L100, SharedPreferencesImpl.java#L470, Instrumentation.java#L1650and so on.

+0

Corto y dulce. Perder el 'getThread()' es limpio. – ahcox

+5

Cabe destacar que aunque bbalazs menciona su ICS, esto es compatible con API 1 en adelante. ¡Así que debería ser seguro para todos los dispositivos! –

+0

➕1 para referencia a la fuente AOSP. – CJBS

2

Si desea saber si se encuentra en el hilo principal, tal vez podría intentar:

Context c = **Get a Context**; 
Thread.currentThread() == c.getMainLooper().getThread(); 

Por supuesto, puedo estar equivocado, y esto podría soplar totalmente su aplicación hacia arriba.

+0

Una prueba rápida sugiere que esto funciona bien. –

+0

Esto funciona, pero no es necesario obtener un contexto, consulte la respuesta de bbalazs. –

Cuestiones relacionadas