problème de gestionnaire Android

1. Qu'est-ce qu'un gestionnaire?

Réponse: Le gestionnaire est un mécanisme de mise à jour de l'interface utilisateur et un mécanisme de traitement des messages. Nous pouvons envoyer et traiter des messages.

 

2. Pourquoi y a-t-il un gestionnaire?

R: Lors de la conception d'Android, il encapsule un ensemble de mécanismes de création, de livraison et de traitement des messages. Si vous ne suivez pas ce mécanisme, il n'y a aucun moyen de mettre à jour les informations de l'interface utilisateur et une exception sera levée.

 

3. Comment utiliser le gestionnaire?

答 : 1 、 poste (exécutable);

       2 、 postDelayed (Runnable, long);

       3 、 sentMessage

       4 、 sentMessageDelayed

 

4. Pourquoi Android devrait-il être configuré pour mettre à jour l'interface utilisateur uniquement via le mécanisme du gestionnaire?

Réponse: Le problème le plus fondamental est de résoudre le problème de la concurrence multithread;

      Supposons que s'il existe plusieurs threads pour mettre à jour l'interface utilisateur dans une activité et qu'il n'y ait pas de mécanisme de verrouillage, le cheval causera-t-il un tel problème? -Interface de mise à jour chaotique;

      Quel genre de problèmes se poserait si toutes les opérations de mise à jour de l'interface utilisateur étaient verrouillées? -Dégradation des performances

      Pour la prise en compte des problèmes ci-dessus, Android propose un ensemble de mécanismes de mise à jour de l'interface utilisateur, il suffit de suivre un tel mécanisme.

      Ne vous inquiétez pas du multi-threading. Les opérations de mise à jour de l'interface utilisateur sont toutes interrogées dans la file d'attente de messages du thread principal.

 

5. Quel est le principe du gestionnaire?

Réponse: 1. Le message du package du gestionnaire est envoyé (notamment en indiquant à qui le message est envoyé)

      2. Looper - le porteur de l'encapsulation des messages. (1) Il y a une MessageQueue à l'intérieur, tous les messages envoyés par le gestionnaire vont dans cette file d'attente de messages; (2) La méthode Looper.Looper est une boucle sans fin, récupérant constamment des messages de MessageQueue, s'il y a un message, traitez le message, s'il n'y a pas de message Bloqué.

      3. MessageQueue, une file d'attente de messages, ajouter des messages, traiter des messages

      4. Le gestionnaire est associé en interne à Looper, gestionnaire-> Looper-> MessageQueue, le gestionnaire envoie un message pour envoyer un message à la file d'attente MessageQueue.

     Résumé: Le gestionnaire est responsable de l'envoi des messages et Looper est responsable de la réception des messages envoyés par le gestionnaire et de la transmission des messages au gestionnaire lui-même.

              MessageQueue est un conteneur pour stocker des messages.

 

6. Quel est le rôle de HandlerThread?

Réponse: HandlerThread thread = nouveau  HandlerThread ("thread de gestionnaire"); inclut automatiquement un mécanisme d'attente et attend la création de Looper avant de créer un gestionnaire pour éviter l'exception de pointeur nul.

 

7, le fil conducteur

* ActivityThread crée le thread principal par défaut, Looper est créé par défaut dans le principal, et MessageQueue est créé par défaut par le Looper

* threadLocal enregistre les informations sur les variables de thread, les méthodes incluent: set, get

 

8. Comment Android met-il à jour l'interface utilisateur?

Réponse: 1. runOnUIThread

   Poste de manutention 2 、

   3 、 gestionnaire sendMessage

   4 、 voir le message

 

9. Les threads non UI peuvent-ils vraiment mettre à jour l'interface utilisateur?

Réponse: Pas nécessairement, la raison pour laquelle le thread enfant ne peut pas mettre à jour l'interface est parce qu'Android utilise checkThread dans la méthode de thread pour déterminer s'il s'agit du thread principal, et cette méthode est dans ViewRootImpl. Cette classe est générée dans onResume, donc À l'heure actuelle, si le thread enfant génère une interface utilisateur de mise à jour dans la méthode onCreate et ne se bloque pas, c'est une opération longue et l'interface utilisateur peut toujours être mise à jour.

 

10. Problèmes rencontrés lors de l'utilisation de Handler?

Réponse: Par exemple, le thread enfant met à jour l'interface utilisateur car la méthode checkThread est déclenchée pour vérifier si l'interface utilisateur est mise à jour dans le thread principal. Il n'y a pas non plus de zone répétée dans le thread enfant. Cette raison est due au mécanisme du gestionnaire. Lorsque le gestionnaire envoie un message, il doit Placez le Message dans MessageQueue et s'il n'y a pas de Looper à ce moment, le MessageQueue ne peut pas être émis en boucle. À ce stade, le Looper est une erreur vide.

 

11. Comment le thread principal informe-t-il le thread enfant?

Réponse: vous pouvez utiliser HandlerThread pour générer un gestionnaire d'un thread enfant, implémenter la méthode handlerMessage, puis générer un gestionnaire dans le thread principal, puis notifier le thread enfant en appelant la méthode sendMessage. De même, le thread enfant peut également appeler la méthode sendMessage pour notifier le thread principal. Les avantages de cette opération, tels que le chargement de certaines images, l'accès au réseau peuvent être plus longs, il est donc plus approprié de les placer dans le thread enfant.

A publié 10 articles originaux · J'aime 11 · Visites 20 000+

Je suppose que tu aimes

Origine blog.csdn.net/u013323018/article/details/83019963
conseillé
Classement