关闭

Android笔记二(MessageQueue && Message)

标签: android
65人阅读 评论(0) 收藏 举报
分类:

MessageQueue

对于这个类,开始时,我们需要注意到google源码对其的注释说明:
这里写图片描述
消息是通过Handler以及Looper添加到Messagequeue消息队列中去的。我们可以通过new Looper()构造方法在当前线程中创建一个消息队列。也就是说创建Looper的时候就会创建相应的消息队列。既然消息队列最重要的作用就是对消息的处理,下面重点了解下两个方法

  • enqueueMessage()
  • next()

enqueueMessage()方法最终是通过Handler的sendMessageAtTime被调用的。也就是说,每次Handler发送一条消息的时候,都会将一条消息推到消息队列MessageQueue中去。进入这个方法,我们会看到先对msg.target进行判断,target是何物?我们在new这个消息的时候就会已经对其赋值了,target = this(Handler),也就是将这个消息推进消息队列的Handler本身。如图所示将消息添加到队列中
这里写图片描述
这里写图片描述

next()方法中主要是完成消息的读取,每次都会读取队列头部的消息Header,该方法是在Looper类中的loop()方法中被调用,Android笔记1有提到调用的流程,现在剖析下next方法具体干了啥事儿。
这里写图片描述

我们一直只知道消息通过Looper循环进来出去,真正的流程就是这些,在next方法中从管道获取消息(这儿可能会产生block),在dispatchMessage中处理消息,在enqueueMessage中又将消息发送至管道中,其中后两步是在调用Handler的方法完成的,这样在Looper的loop()方法中一直走next–>enqueueMessage这个流程

  • 消息是以链表的形式出现的
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:9863次
    • 积分:362
    • 等级:
    • 排名:千里之外
    • 原创:23篇
    • 转载:12篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论
    人体时钟