web-dev-qa-db-fra.com

Comment vérifier si le thread actuel n'est pas le thread principal

Je dois vérifier si le thread qui exécute un code est le thread principal (UI) ou non Comment puis-je atteindre cet objectif?

320
1CjaWfbSbARo
Looper.myLooper() == Looper.getMainLooper()

si cela retourne vrai, alors vous êtes sur le fil de l'interface utilisateur!

607
Carnal

vous pouvez utiliser le code ci-dessous pour savoir si le thread actuel est UI/thread principal ou non

if(Looper.myLooper() == Looper.getMainLooper()) {
   // Current Thread is Main Thread.
}

ou vous pouvez aussi utiliser ceci 

if(Looper.getMainLooper().getThread() == Thread.currentThread()) {
   // Current Thread is Main Thread.
}

Voici une question similaire

103
AAnkit

Le meilleur moyen est le plus clair et le plus robuste: *

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

Ou, si la plate-forme d’exécution est de niveau API 23 (Marshmallow 6.0) ou supérieure:

Looper.getMainLooper().isCurrentThread()

Voir le Looper API . Notez que l'appel de Looper.getMainLooper() implique une synchronisation (voir le source ). Vous voudrez peut-être éviter la surcharge en stockant la valeur de retour et en la réutilisant.

* credit greg7gkb et 2cupsOfTech

37
Michael Allan

Résumant les solutions, je pense que c'est la meilleure:

boolean isUiThread = VERSION.SDK_INT >= VERSION_CODES.M 
    ? Looper.getMainLooper().isCurrentThread()
    : Thread.currentThread() == Looper.getMainLooper().getThread();

Et, si vous souhaitez exécuter quelque chose sur le fil de l'interface utilisateur, vous pouvez utiliser ceci:

new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
       //this runs on the UI thread
    }
});
17
android developer

Tu peux vérifier  

if(Looper.myLooper() == Looper.getMainLooper()) {
   // You are on mainThread 
}else{
// you are on non-ui thread
}
2

vous pouvez le vérifier dans Android ddms logcat où l'id du processus sera le même mais l'id du fil sera différent.

1
Vishwanath.M

Permettez-moi de commencer avec ceci: j'ai reconnu que ce message avait l'étiquette "Android", cependant, ma recherche n'avait rien à voir avec "Android" et c'était mon meilleur résultat. À cette fin, pour les non-Android SO Java utilisateurs qui atterrissent ici, n'oubliez pas:

public static void main(String[] args{
    Thread.currentThread().setName("SomeNameIChoose");
    /*...the rest of main...*/
}

Après avoir défini cela, ailleurs dans votre code, vous pouvez facilement vérifier si vous êtes sur le point de s'exécuter sur le thread principal avec:

if(Thread.currentThread().getName().equals("SomeNameIChoose"))
{
    //do something on main thread
}

Un peu gêné, j'avais cherché avant de m'en souvenir, mais j'espère que cela aidera quelqu'un d'autre!

0
ThatOneGuy

Xamarin.Android port: (C#)

public bool IsMainThread => Build.VERSION.SdkInt >= BuildVersionCodes.M
    ? Looper.MainLooper.IsCurrentThread
    : Looper.MyLooper() == Looper.MainLooper;

Usage:

if (IsMainThread) {
    // you are on UI/Main thread
}
0
Mehdi Dehghani