Je dois vérifier si le thread exécutant un certain morceau de code est le thread principal (UI) ou non. Comment puis-je atteindre cet objectif?
Je dois vérifier si le thread exécutant un certain morceau de code est le thread principal (UI) ou non. Comment puis-je atteindre cet objectif?
Réponses:
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 / Main thread ou non
if(Looper.myLooper() == Looper.getMainLooper()) {
// Current Thread is Main Thread.
}
ou vous pouvez également l'utiliser
if(Looper.getMainLooper().getThread() == Thread.currentThread()) {
// Current Thread is Main Thread.
}
Looper.myLooper()
retournera null si le thread n'est pas associé à un Looper. Les deux sont donc sûrs et ont le même résultat, mais le premier est un peu plus lent pendant qu'il recherche dans une carte pour trouver le looper et son thread associé et faire d'autres choses.
Le meilleur moyen est le moyen 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érieur:
Looper.getMainLooper().isCurrentThread()
Voir l' API Looper . Notez que l'appel Looper.getMainLooper()
implique la synchronisation (voir la source ). Vous souhaiterez peut-être éviter la surcharge en stockant la valeur de retour et en la réutilisant.
* crédit greg7gkb et 2cupsOfTech
Looper.myLooper() == Looper.getMainLooper()
, ce qui, je pense, est moins clair. Je crédite greg7gkb.
equals
, et revient donc à ==
, mais cela pourrait changer à l'avenir. J'ai donc corrigé la réponse.
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 thread d'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
}
Permettez-moi de faire une préface à ceci: j'ai reconnu que ce post avait le tag 'Android', cependant, ma recherche n'avait rien à voir avec 'Android' et c'était mon meilleur résultat. À cette fin, pour les utilisateurs non Android SO Java qui arrivent 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 d'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!
vous pouvez le vérifier dans android ddms logcat où l'identifiant du processus sera le même mais l'identifiant du thread sera différent.
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
}
Vous pouvez essayer Thread.currentThread (). IsDaemon ()