¿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.

ParDroid
fuente
Vea mi respuesta aquí: stackoverflow.com/a/41280460/878126
desarrollador de Android

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.
}
mik3y
fuente
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
 }
Átomo
fuente
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.

stan0
fuente
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
}
yushulx
fuente
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

ridoy
fuente
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