Question : Les threads non-UI peuvent-ils mettre à jour l'interface utilisateur ?

Quel est le fil de discussion de l'interface utilisateur

 Tous les processus sont forkés par zygote.
 Après avoir quitté l'application, ActivityThread sera démarré pour exécuter la méthode principale et créer Looper. 

Pourquoi l’interface utilisateur ne peut-elle pas être configurée pour être thread-safe ?

  • L'interface utilisateur présente une variabilité, même une variabilité à haute fréquence

  • La sensibilité de l’interface utilisateur au temps de réponse exige que les opérations de l’interface utilisateur soient efficaces

  • Les composants de l'interface utilisateur doivent être dessinés par lots pour garantir l'efficacité

Les threads non-UI ne doivent-ils pas pouvoir mettre à jour l'interface utilisateur ?

  • Mettre à jour l'interface utilisateur indirectement

        Le thread IO effectue des requêtes réseau et notifie les mises à jour de l'interface utilisateur via le gestionnaire ou postInvalidate.

  • SurfaceView met directement à jour l'interface utilisateur, crée un fil de discussion unique et le verrouille 


        GLSurfaceView openGL TextureView         pour les cartes est officiellement recommandé

Le délai de Hamdler pour l'envoi de messages est-il fiable ?

Peu fiable, des problèmes peuvent survenir
lorsqu'il y a trop de messages. Lorsqu'il y a trop de messages postés par le gestionnaire et que le message du gestionnaire ne peut pas être traité, le thread principal sera bloqué. Le
temps d'appel n'est pas la valeur réelle du délai.

Comment MessageQueue traite-t-il les messages ?

        Le post sendMessage du gestionnaire et d'autres méthodes finiront par appeler la méthode enqueueMessage.

        Si le message se trouve au début de la file d'attente et remplit les conditions, il sera traité immédiatement. Sinon, recherchez la position correspondante et insérez-la.
        S'il n'y a pas de message dans la file d'attente des messages, il sera bloqué jusqu'à ce qu'un message arrive.
        Dans la méthode de boucle de Looper,À chaque fois,la méthode suivante de MessageQueue est appelée pour lire le message suivant,une boucle infinie, dans laquelle nativePollOnce est appelée en premier. En fait, la MessageQueue sous-jacente est appelée et la liste chaînée sous-jacente est traitée premier. Si nextPollTimeoutMillis est -1, en bas sera bloqué, c'est-à-dire que la logique suivante vient d'être traitée et le message n'a aucun message.
        S'il n'est pas bloqué, il exécutera la couche Java, obtiendra le premier message qui peut être exécuté, puis vérifiez si le temps remplit les conditions. Si le temps est écoulé, attribuez-le à nextPollTimeoutMillis et nativePollOnce bloquera.

        Lorsque nextPollTimeoutMillis reçoit le message, il renvoie ce message et quitte la boucle infinie.

Optimisation de la file d'attente

  • Filtrage des messages en double

        Le même type d'événement est envoyé fréquemment pendant l'exécution. Les messages en double peuvent être supprimés en déterminant une fréquence appropriée, ce qui garantit non seulement l'expérience utilisateur, mais gère également le rendu à haute fréquence.

  • Annulation de message mutuellement exclusive

        Supprimer tous les messages précédents mutuellement exclusifs

  • Réutiliser les messages

        Lorsque des volumes importants nécessitent la création fréquente de messages, utilisez des pools de messages pour réduire la fréquence du GC.

  • Utilisez message inactif IdleHandler pour déclencher lorsqu'il n'y a aucun message dans la file d'attente des messages.
  • Utiliser le Looper exclusif 

Pourquoi le Looper du thread principal ne provoque-t-il pas l'ANR de l'application ?

Type ANR

  • Expiration du délai de service 

    Service de réception 20 s
    Service back-end 200 s

  • Délai d'expiration de la file d'attente de diffusion 

    Diffusion au premier plan pendant 10 secondes
    et diffusion en arrière-plan pendant 60 secondes.

  • Délai d'expiration du fournisseur de contenu 10 s 
  • Délai d'attente de distribution d'entrée 5 s

Looper est un concept sur l'ensemble du processus.
L'ANR est une méthode de surveillance permettant aux développeurs de prendre le temps d'occuper le thread principal lors de l'exécution d'un certain lien. Il est utilisé pour rappeler aux développeurs et constitue un petit sous-lien dans Looper.

Pourquoi Looper n’entraîne-t-il pas une utilisation élevée du processeur ?

        Lorsqu'il n'y a aucun message dans la file d'attente des messages, la méthode nativePoolOnce sous-jacente sera appelée, qui appellera epoll_wait pour bloquer. Lorsqu'il y a un message, nativtWake sera appelé pour se réveiller.

Comment implémenter un gestionnaire simple

Capacités de base du gestionnaire
1. Communication inter-thread
2. Exécution des tâches retardée

Les fonctionnalités de base de MessageQueue
1. Mettre en attente les messages
2. Trier les messages par heure (file d'attente prioritaire, liste à chaînage unique)
3. Bloquer la lecture lorsque la file d'attente est vide
4. Le nœud principal peut bloquer régulièrement s'il y a un retard

Guess you like

Origin blog.csdn.net/weixin_42277946/article/details/131597498