2010-05-17 5 views
95

Existe-t-il un moyen fiable de détecter si Thread.currentThread() est le thread de l'interface utilisateur du système Android dans une application?
Je voudrais mettre quelques affirmations dans mon code modèle qui affirme qu'un seul thread (par exemple le thread ui) accède à mon état, pour assurer qu'aucune synchronisation n'est nécessaire.Comment détecter le thread UI sur Android?

+0

Voir ma réponse ici: http://stackoverflow.com/a/41280460/878126 –

Répondre

1

Impossible d'utiliser la méthode runOnUiThread dans la classe Activity Voir ..

http://developer.android.com/reference/android/app/Activity.html#runOnUiThread%28java.lang.Runnable%29

+4

Mon application fonctionne, mais, elle a plusieurs auteurs et devient assez grande et complexe. Ce que je veux faire est d'ajouter un filet de sécurité supplémentaire, une affirmation qui attrape l'erreur si quelqu'un appelle une méthode qui est conçue pour être appelée seulement à partir du thread GUI à partir d'un autre thread. – ParDroid

+0

Je corrige actuellement un bogue où l'utilisation de runOnUiThread provoque le clignotement de l'UX. – fobbymaster

163

pratique courante pour déterminer l'identité de l'interface utilisateur thread via Looper#getMainLooper:

if (Looper.getMainLooper().getThread() == Thread.currentThread()) { 
    // On UI thread. 
} else { 
    // Not on UI thread. 
} 
+4

http://stackoverflow.com/questions/11411022/how-to-check-if-current-thread-is-not-main-thread Cette réponse est bien aussi) – UnknownJoe

42

Je pense le meilleur moyen est le suivant:

if (Looper.getMainLooper().equals(Looper.myLooper())) { 
    // UI thread 
} else { 
    // Non UI thread 
} 
+0

Fonctionne très bien. Je vous remercie! – Hong

+0

Mieux vaut avec égaux, merci! –

+3

Pas besoin d'utiliser 'equals' puisque nous ne faisons que comparer des références, et en plus, elles sont toutes les deux statiques. – mr5

2

En plus de vérifier looper, si vous avez déjà essayé de fermeture de session id fil dans onCreate(), vous pouvez trouver le thread d'interface utilisateur (thread principal) id est toujours égal à 1. Par conséquent

if (Thread.currentThread().getId() == 1) { 
    // UI thread 
} 
else { 
    // other thread 
} 
+0

Je ne trouve aucune documentation officielle corroborant que cela soit vrai, et le sera toujours. avez vous un lien? –

+0

C'est ce que j'ai trouvé dans logcat quand je veux surveiller le comportement multi-thread. Vous pouvez essayer de sortie l'ID de fil – yushulx

+8

Je recommanderais fortement contre cela, car cette valeur peut être spécifique à votre appareil et/ou la version d'Android. Même si c'était le cas sur tous les appareils Android en ce moment, il n'y a aucune garantie que cela continuera d'être le cas dans les versions ultérieures. Enregistrer l'ID de thread dans un membre de classe lors de l'exécution de onCreate() me semble un peu plus raisonnable. – personne3000

0

A partir du niveau API 23, le Looper a une belle méthode d'assistance isCurrentThread. Vous pouvez obtenir le mainLooper et voir si elle est l'un pour le thread courant de cette façon:

Looper.getMainLooper().isCurrentThread() 

Il est pratiquement le même que:

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

, mais il pourrait être un peu plus lisible et plus facile à retenir .

Questions connexes