Je suis nouveau sur android, et est devenu très confus avec ces concepts. J'ai vérifier le guide officiel, encore na pas tout à fait le faire. quelle est la relation entre Looper, Gestionnaire et le Message de la file d'attente?
Réponses
Trop de publicités?Un Looper
est un message de la boucle de gestion: il lit et traite les éléments à partir d'un MessageQueue
. L' Looper
classe est généralement utilisé en conjonction avec un LooperThread
(une sous-classe de Thread
).
Un Handler
est une classe utilitaire qui facilite l'interaction avec un Looper
—principalement par l'envoi de messages et d' Runnable
objets au fil de l' MessageQueue
. Lorsqu'un Handler
est créé, il est lié à un Looper
(et associés fil et le message de la file d'attente).
En utilisation standard, vous pouvez créer et démarrer un LooperThread
, puis de créer un Handler
objet (ou les objets) par lequel les autres threads peuvent interagir avec l' LooperThread
de l'instance. L' Handler
doit être créé lors de l'exécution sur l' LooperThread
, bien qu'une fois créé, il n'y a pas de restrictions sur ce que les threads peuvent utiliser l' Handler
's méthodes de planification (post(Runnable)
, etc.)
Le thread principal (un.k.un. Thread d'INTERFACE utilisateur) dans une application Android est défini comme un boucleur avant que votre application est créée.
En dehors de la classe docs, il y a une belle discussion de tout cela ici.
Il est largement connu que c'est illégal de mettre à jour les composants d'INTERFACE utilisateur directement à partir de fils autres que le thread principal dans android. Cette android document (Manipulation des Opérations Coûteuses dans le Thread de l'INTERFACE utilisateur) suggère les étapes à suivre si nous avons besoin de démarrer un thread séparé pour faire quelques travaux coûteux et mise à jour de l'INTERFACE utilisateur par la suite. L'idée est de créer un Gestionnaire d' objet associé avec le thread principal, et après un Exécutable au moment opportun. Cette Runnable
sera appelée par le thread principal. Ce mécanisme est mis en œuvre avec Looper et Gestionnaire de classes.
L' Looper
classe gère un MessageQueue, qui contient une liste de messages. Un personnage important de Looper est qu'il est associé avec le fil à l'intérieur de laquelle le Looper
est créé. Cette association est gardé pour toujours et ne peut pas être rompu, ni modifiés. Notez également qu'un thread ne peut pas être associés à plus d' un Looper
. Afin de garantir cette association, Looper
est stocké dans le stockage local de threads, et il ne peut pas être créé via son constructeur directement. La seule façon de créer il est pour vous appeler préparer méthode statique sur Looper
. préparer d'abord la méthode examine ThreadLocal de thread en cours pour s'assurer qu'il n'y a pas déjà un Looper associé au thread. Après l'examen, un nouveau Looper
est créé et enregistré dans ThreadLocal
. Ayant préparé l' Looper
, on peut appeler boucle méthode pour vérifier les nouveaux messages et ont Handler
de traiter avec eux.
Comme son nom l'indique, l' Handler
classe est principalement responsable de la gestion (ajout, retrait, l'envoi des messages du thread actuel de l' MessageQueue
. Un Handler
instance est également lié à un fil. La liaison entre le conducteur et le Filetage est réalisé par l'intermédiaire d' Looper
et MessageQueue
. Un Handler
est toujours lié à un Looper
, et par la suite lié à la thread associé avec l' Looper
. Contrairement aux Looper
, de multiples Gestionnaire de cas peut être lié à la même thread. Chaque fois que nous appelons post ou toutes les méthodes se ressemblent sur l' Handler
, un nouveau message est ajouté à l'associated MessageQueue
. Le champ cible du message est mis au courant Handler
de l'instance. Lorsque l' Looper
reçu ce message, il appelle dispatchMessage sur le message du champ cible, de sorte que le message voies de retour à l'instance de Gestionnaire à traiter, mais sur le bon thread.
Les relations entre Looper
, Handler
et MessageQueue
est indiqué ci-dessous: