Devo verificare se il thread che esegue un determinato codice è il thread principale (UI) o meno. Come posso raggiungere questo obiettivo?
Devo verificare se il thread che esegue un determinato codice è il thread principale (UI) o meno. Come posso raggiungere questo obiettivo?
Risposte:
Looper.myLooper() == Looper.getMainLooper()
se questo ritorna vero, allora sei nel thread dell'interfaccia utente!
puoi usare il codice qui sotto per sapere se il thread corrente è UI / thread principale o meno
if(Looper.myLooper() == Looper.getMainLooper()) {
// Current Thread is Main Thread.
}
oppure puoi anche usare questo
if(Looper.getMainLooper().getThread() == Thread.currentThread()) {
// Current Thread is Main Thread.
}
Looper.myLooper()
restituirà null se il thread non è associato a un Looper. Quindi entrambi sono sicuri e hanno lo stesso risultato, ma il primo è un po 'più lento mentre cerca all'interno di una mappa per scoprire il crochet e il thread associato e fare alcune altre cose.
Il modo migliore è il modo più chiaro e robusto: *
Thread.currentThread().equals( Looper.getMainLooper().getThread() )
Oppure, se la piattaforma di runtime è di livello API 23 (Marshmallow 6.0) o superiore:
Looper.getMainLooper().isCurrentThread()
Vedi l' API Looper . Si noti che la chiamata Looper.getMainLooper()
comporta la sincronizzazione (vedere l' origine ). È possibile evitare l'overhead archiviando il valore restituito e riutilizzandolo.
* credit greg7gkb e 2cupsOfTech
Looper.myLooper() == Looper.getMainLooper()
, che penso sia meno chiaro. Accredito greg7gkb.
equals
e quindi ricade su ==
, ma ciò potrebbe cambiare in futuro. Quindi ho corretto la risposta.
Riassumendo le soluzioni, penso che sia la migliore:
boolean isUiThread = VERSION.SDK_INT >= VERSION_CODES.M
? Looper.getMainLooper().isCurrentThread()
: Thread.currentThread() == Looper.getMainLooper().getThread();
E, se desideri eseguire qualcosa sul thread dell'interfaccia utente, puoi utilizzare questo:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
//this runs on the UI thread
}
});
Puoi controllare
if(Looper.myLooper() == Looper.getMainLooper()) {
// You are on mainThread
}else{
// you are on non-ui thread
}
Consentitemi di prefigurare questo: ho riconosciuto che questo post ha il tag "Android", tuttavia, la mia ricerca non aveva nulla a che fare con "Android" e questo è stato il mio miglior risultato. A tal fine, per gli utenti SO Android non Android che atterrano qui, non dimenticare di:
public static void main(String[] args{
Thread.currentThread().setName("SomeNameIChoose");
/*...the rest of main...*/
}
Dopo aver impostato questo, altrove nel tuo codice, puoi facilmente verificare se stai per eseguire sul thread principale con:
if(Thread.currentThread().getName().equals("SomeNameIChoose"))
{
//do something on main thread
}
Un po 'imbarazzato avevo cercato prima di ricordare questo, ma spero che possa aiutare qualcun altro!
puoi verificarlo in android ddms logcat dove l'id del processo sarà lo stesso ma l'id del thread sarà diverso.
Xamarin.Android
porto: ( 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
}
Puoi provare Thread.currentThread (). IsDaemon ()