Come rilevare il thread dell'interfaccia utente su Android?


117

Esiste un modo affidabile per rilevare se Thread.currentThread()il thread dell'interfaccia utente del sistema Android si trova in un'applicazione?
Vorrei inserire alcune affermazioni nel mio codice modello che affermano che solo un thread ( ad esempio il thread ui) accede al mio stato, per garantire che non sia necessario alcun tipo di sincronizzazione.


Risposte:


199

La pratica comune per determinare l'identità del thread dell'interfaccia utente è tramite Looper # getMainLooper :

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

Dal livello API 23 in su, esiste un approccio leggermente più leggibile utilizzando il nuovo metodo di supporto isCurrentThread sul looper principale:

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


44

Penso che il modo migliore sia questo:

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

Funziona alla grande. Grazie!
Hong

3
Non è necessario utilizzarli equalspoiché stiamo solo confrontando i riferimenti e, soprattutto, sono entrambi statici.
mr5

8

A partire dal livello API 23, Looperha un bel metodo di supporto isCurrentThread. Puoi ottenere mainLoopere vedere se è quello per il thread corrente in questo modo:

Looper.getMainLooper().isCurrentThread()

È praticamente lo stesso di:

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

ma potrebbe essere un po 'più leggibile e più facile da ricordare.



2

Oltre a controllare il looper , se hai mai provato a disconnetterti dall'ID del thread onCreate(), potresti trovare l' id del thread dell'interfaccia utente (thread principale) sempre uguale a 1. Pertanto

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

Non riesco a trovare alcuna documentazione ufficiale che confermi che questo è vero, e lo sarà sempre. Avete un link?
intrepidis

Questo è ciò che ho trovato in logcat quando voglio monitorare il comportamento multi-thread. Puoi provare a generare l'ID del thread
yushulx

8
Lo sconsiglio vivamente, poiché questo valore potrebbe essere specifico per il tuo dispositivo e / o versione di Android. Anche se fosse così su tutti i dispositivi Android in questo momento, non vi è alcuna garanzia che continuerà ad esserlo nelle versioni successive. Salvare l'ID del thread in un membro della classe durante l'esecuzione di onCreate () mi sembra un po 'più ragionevole.
personne3000

1

Non potresti usare il runOnUiThreadmetodo nella Activityclasse? Vedi ..

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


4
La mia applicazione funziona, ma ha diversi autori e sta diventando piuttosto grande e complessa. Quello che voglio fare è aggiungere una rete di sicurezza extra, un'asserzione che cogli l'errore se qualcuno sta chiamando un metodo progettato per essere chiamato solo dal thread della GUI da un altro thread.
ParDroid

Attualmente sto risolvendo un bug in cui l'uso di runOnUiThread causa il flash dell'esperienza utente.
fobbymaster
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.