450 votes

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

Je dois vérifier si le thread qui exécute un certain morceau de code est le thread principal (UI) ou non. Comment puis-je y parvenir ?

0 votes

Exemple à démontrer avec un exemple de fil code2concept.blogspot.in/2015/02/

793voto

Carnal Points 7150
Looper.myLooper() == Looper.getMainLooper()

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

138voto

Ankit Points 8197

Vous pouvez utiliser le code suivant pour savoir si le thread actuel est le thread UI/Main ou non

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

ou vous pouvez également utiliser ceci

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

Voici une question similaire

10 votes

Doit-on considérer cette dernière option comme la plus sûre car il n'y a aucune garantie qu'un thread arbitraire soit associé à un Looper (en supposant que le thread principal soit toujours associé à un Looper) ?

0 votes

Looper.myLooper() retournera null si le thread n'est pas associé à un Looper. Donc les deux sont sûrs et ont le même résultat mais le premier est un peu plus lent pendant qu'il cherche dans une carte pour trouver le looper et son thread associé et faire d'autres choses.

73voto

Michael Allan Points 1761

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

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

Ou, si la plateforme d'exécution est de niveau API 23 (Marshmallow 6.0) ou plus :

Looper.getMainLooper().isCurrentThread()

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

   * crédit greg7gkb y 2cupsOfTech

28voto

android developer Points 20939

En 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 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
    }
});

7voto

Love Points 1

Vous pouvez vérifier

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X