Analyse MessageQueue

Implémentation de MessageQueue

Elle est implémentée par une liste chaînée simple car la liste chaînée a de bonnes performances d'insertion et de suppression. En fait, c'est un objet, pointant vers l'objet suivant, en boucle pour former une chaîne, et n'a besoin d'enregistrer qu'un seul objet.

enqueueMessage()
1. Il a été terminé, l'appel de cette méthode lèvera une exception.

2. Déterminez si l'heure du nouveau message est la plus petite parmi les messages existants. Si oui, insérez-la dans l'en-tête de la file d'attente et pointez à côté du message suivant. Ce nouveau message est enregistré en tant que message de l'en-tête de la file d'attente pour la prochaine comparaison.

3. Si ce n'est pas le cas, organisez-les dans l'ordre croissant de l'heure
4. Enfin, déterminez si la file d'attente est en sommeil et, si c'est le cas, appelez nativeWake() pour la réveiller.

La méthode next()
looper.loop() appellera next pour démarrer la boucle, se réveillera après avoir dormi et appellera à nouveau next().

La méthode renverra un message et le remettra au looper pour exécution.

1. Jugez d'abord s'il s'agit d'un message de barrière synchrone, si c'est le cas, vous devez ouvrir pendant un certain temps pour trouver le premier message asynchrone

2. Si le message est vide, s'il est vide, cela signifie qu'il n'y a pas de message dans la file d'attente, si nextPollTimeoutMillis=-1, cela signifie qu'il a dormi.

3. S'il n'est pas vide, jugez si le msg a atteint l'heure d'exécution, supprimez-le et renvoyez le message s'il arrive, et donnez nextPollTimeoutMillis=la différence avec l'heure actuelle si ce n'est pas le cas

Au cycle suivant, nextPollTimeoutMillis jugera s'il faut dormir ou non.

Guess you like

Origin blog.csdn.net/weixin_44380181/article/details/129738651