2010-05-17 20 views
95

C'è un modo efficace per rilevare se Thread.currentThread() è il thread dell'interfaccia utente del sistema Android in un'applicazione?
Vorrei inserire alcuni asserzioni nel mio codice modello che asserisca che solo un thread (ad es. il thread ui) accede al mio stato, per garantire che non sia necessario alcun tipo di sincronizzazione.Come rilevare il thread dell'interfaccia utente su Android?

+0

Vedere la mia risposta qui: http://stackoverflow.com/a/41280460/878126 –

risposta

1

Impossibile si utilizza il metodo runOnUiThread nella classe Activity vedere ..

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 cattura il misstake se qualcuno chiama un metodo progettato per essere chiamato solo dal thread della GUI da un altro thread. – ParDroid

+0

Attualmente sto correggendo un bug in cui l'uso di runOnUiThread fa lampeggiare l'UX. – fobbymaster

163

pratica comune per determinare l'identità del thread UI è via Looper#getMainLooper:?

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

http://stackoverflow.com/questions/11411022/how-to-check-if-current-thread-is-not-main-thread Anche questa risposta è piacevole) – UnknownJoe

42

penso il modo migliore è questo:

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

Funziona alla grande. Grazie! – Hong

+0

Meglio con gli uguali, grazie! –

+3

Non c'è bisogno di usare 'equals' dato che stiamo solo confrontando i riferimenti, e per di più sono entrambi statici. – mr5

2

Oltre a verificare crochet, se avete mai provato a disconnessione filo id in onCreate(), si potrebbe trovare il filo UI (thread principale) id è sempre uguale a 1. Pertanto

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

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

+0

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

+8

. Ti consigliamo vivamente di non farlo perché questo valore potrebbe essere specifico per il tuo dispositivo e/o versione di Android. Anche se fosse il caso su ogni dispositivo Android in questo momento, non c'è alcuna garanzia che continuerà ad essere il caso nelle versioni successive. Salvare l'ID del thread in un membro della classe quando si esegue onCreate() sembra un po 'più ragionevole per me. – personne3000

0

A partire dal livello API 23 il Looper ha un bel metodo di supporto isCurrentThread. Si potrebbe ottenere il mainLooper e vedere se è quella per il thread corrente in questo modo:

Looper.getMainLooper().isCurrentThread() 

E 'praticamente lo stesso di:

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

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

Problemi correlati