110 votes

quelle est la relation entre Looper, Gestionnaire et le Message de la file d'attente ?

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?

114voto

Ted Hopp Points 122617

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.

99voto

K_Anas Points 13724

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:

enter image description here

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