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?
Looper.myLooper() == Looper.getMainLooper()
si cela retourne vrai, alors vous êtes sur le fil de l'interface utilisateur!
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.
}
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
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
}
});
Tu peux vérifier
if(Looper.myLooper() == Looper.getMainLooper()) {
// You are on mainThread
}else{
// you are on non-ui thread
}
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.
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!
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
}