¿Cómo detectar el hilo de la interfaz de usuario en Android?


117

¿Existe una forma sólida de detectar si Thread.currentThread()el hilo de la interfaz de usuario del sistema Android está en una aplicación?
Me gustaría poner algunas afirmaciones en el código de mi modelo que afirman que solo un hilo ( por ejemplo, el hilo de la interfaz de usuario) accede a mi estado, para asegurar que no sea necesario ningún tipo de sincronización.


Respuestas:


199

La práctica común para determinar la identidad del subproceso de la interfaz de usuario es a través de Looper # getMainLooper :

if (Looper.getMainLooper().getThread() == Thread.currentThread()) {
  // On UI thread.
} else {
  // Not on UI thread.
}

Desde el nivel de API 23 en adelante, hay un enfoque un poco más legible utilizando el nuevo método auxiliar isCurrentThread en el bucle principal:

if (Looper.getMainLooper().isCurrentThread()) {
  // On UI thread.
} else {
  // Not on UI thread.
}

6
stackoverflow.com/questions/11411022/… Esta respuesta también es buena)
UnknownJoe

44

Creo que la mejor manera es esta:

 if (Looper.getMainLooper().equals(Looper.myLooper())) {
     // UI thread
 } else {
     // Non UI thread
 }

Funciona genial. ¡Gracias!
Hong

3
No es necesario usarlo, equalsya que solo estamos comparando referencias y, además, ambas son estáticas.
mr5

8

A partir del nivel de API 23, Loopertiene un buen método de ayuda isCurrentThread. Puede obtener el mainLoopery ver si es el del hilo actual de esta manera:

Looper.getMainLooper().isCurrentThread()

Es prácticamente lo mismo que:

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

pero podría ser un poco más legible y más fácil de recordar.



2

Además de verificar el looper , si alguna vez intentó cerrar la sesión con el ID del hilo onCreate(), podría encontrar que el ID del hilo de la interfaz de usuario (hilo principal) siempre es igual a 1. Por lo tanto

if (Thread.currentThread().getId() == 1) {
    // UI thread
}
else {
    // other thread
}

No encuentro ninguna documentación oficial que corrobore que esto sea cierto, y siempre lo será. ¿Tienes un enlace?
intrepidis

Esto es lo que encontré en logcat cuando quiero monitorear el comportamiento de múltiples subprocesos. Puede intentar generar la identificación del hilo
yushulx

8
Recomiendo encarecidamente no hacerlo, ya que este valor puede ser específico de su dispositivo y / o versión de Android. Incluso si fuera el caso en todos los dispositivos Android en este momento, no hay garantía de que continúe siendo el caso en versiones posteriores. Guardar el ID del hilo en un miembro de la clase cuando se ejecuta onCreate () me parece un poco más razonable.
personne3000

1

¿No pudiste usar el runOnUiThreadmétodo en la Activityclase? Mira ...

http://developer.android.com/reference/android/app/Activity.html#runOnUiThread%28java.lang.Runnable%29


4
Mi aplicación está funcionando, pero tiene varios autores y se está volviendo bastante grande y compleja. Lo que quiero hacer es agregar una red de seguridad adicional, una afirmación que detecta el error si alguien está llamando a un método que está diseñado para ser llamado solo desde el hilo de la GUI desde otro hilo.
ParDroid

Actualmente estoy solucionando un error en el que el uso de runOnUiThread hace que la UX parpadee.
fobbymaster
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.