Necesito verificar si el hilo que ejecuta cierto código es el hilo principal (UI) o no. ¿Cómo puedo conseguir esto?
Necesito verificar si el hilo que ejecuta cierto código es el hilo principal (UI) o no. ¿Cómo puedo conseguir esto?
Respuestas:
Looper.myLooper() == Looper.getMainLooper()
Si esto devuelve verdadero, entonces estás en el hilo de la interfaz de usuario.
puede usar el siguiente código para saber si el hilo actual es UI / hilo principal o no
if(Looper.myLooper() == Looper.getMainLooper()) {
// Current Thread is Main Thread.
}
o también puedes usar esto
if(Looper.getMainLooper().getThread() == Thread.currentThread()) {
// Current Thread is Main Thread.
}
Looper.myLooper()
devolverá nulo si el hilo no está asociado con un Looper. Por lo tanto, ambos son seguros y tienen el mismo resultado, pero el primero es un poco más lento mientras busca dentro de un mapa para descubrir el enlazador y su hilo asociado y hacer otras cosas.
La mejor manera es la más clara y robusta: *
Thread.currentThread().equals( Looper.getMainLooper().getThread() )
O, si la plataforma de tiempo de ejecución es API nivel 23 (Marshmallow 6.0) o superior:
Looper.getMainLooper().isCurrentThread()
Ver la API de Looper . Tenga en cuenta que las llamadas Looper.getMainLooper()
implican sincronización (ver la fuente ). Es posible que desee evitar la sobrecarga almacenando el valor de retorno y reutilizándolo.
* crédito greg7gkb y 2cupsOfTech
Looper.myLooper() == Looper.getMainLooper()
, lo que creo que es menos claro. Le doy crédito a greg7gkb.
equals
, por lo que recurre a ==
, pero eso podría cambiar en el futuro. Entonces corregí la respuesta.
Resumiendo las soluciones, creo que esa es la mejor:
boolean isUiThread = VERSION.SDK_INT >= VERSION_CODES.M
? Looper.getMainLooper().isCurrentThread()
: Thread.currentThread() == Looper.getMainLooper().getThread();
Y, si desea ejecutar algo en el hilo de la interfaz de usuario, puede usar esto:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
//this runs on the UI thread
}
});
Puedes comprobar
if(Looper.myLooper() == Looper.getMainLooper()) {
// You are on mainThread
}else{
// you are on non-ui thread
}
Permítanme presentar esto con anterioridad: reconocí que esta publicación tiene la etiqueta 'Android', sin embargo, mi búsqueda no tuvo nada que ver con 'Android' y este fue mi resultado principal. Con ese fin, para los usuarios de SO Java que no son Android que aterrizan aquí, no se olviden de:
public static void main(String[] args{
Thread.currentThread().setName("SomeNameIChoose");
/*...the rest of main...*/
}
Después de configurar esto, en otra parte de su código, puede verificar fácilmente si está a punto de ejecutar en el hilo principal con:
if(Thread.currentThread().getName().equals("SomeNameIChoose"))
{
//do something on main thread
}
Un poco avergonzado había buscado antes de recordar esto, ¡pero espero que ayude a alguien más!
puede verificarlo en android ddms logcat donde la identificación del proceso será la misma pero la identificación del hilo será diferente.
Xamarin.Android
puerto: ( C#
)
public bool IsMainThread => Build.VERSION.SdkInt >= BuildVersionCodes.M
? Looper.MainLooper.IsCurrentThread
: Looper.MyLooper() == Looper.MainLooper;
Uso:
if (IsMainThread) {
// you are on UI/Main thread
}
Puede probar Thread.currentThread (). IsDaemon ()