今天心血来潮,又默默的想着Handler的实现原理,毕竟面试这个可是热门的话题,虽然看了很多遍源码,但每次都是研究Loop和Handler的关系,今天看着看着进到MessageQueue的源码里,了解了下把Message入队的操作,分享给大家。

首先我们先看Message类,根据名字我们可以知道它是消息的意思,我们每次调用handler.post(Runnable)系统都会调用getPostMessage方法 转换成一个Message,它内部有个变量next,它的类型也是Message,数据结构基础好的童鞋应该会反应过来,没错Message类似于一个链表结构。

进入正题先看enqueueMessage部分源码:

boolean enqueueMessage(Message msg, long when) {
msg.when = when;
Message p = mMessages;
if (p == null || when == 0 || when < p.when) {
boolean needWake;
msg.next = p;
// New head, wake up the event queue if blocked.
mMessages = msg;
// Inserted within the middle of the queue. Usually we don't have to wake
needWake = mBlocked;
} else {
// and the message is the earliest asynchronous message in the queue.
// up the event queue unless there is a barrier at the head of the queue
p = p.next;
needWake = mBlocked && p.target == null && msg.isAsynchronous();
Message prev;
for (;;) {
prev = p;
msg.next = p; // invariant: p == prev.next
if (p == null || when < p.when) {
break;
}
if (needWake && p.isAsynchronous()) {
needWake = false;
}
}
msg.next = p;
prev.next = msg;
}
参数msg是由我们传进去的Runnable转换成的对象,when时是执行时间,当我们调handler.post 时该值为0,细心的朋友会发现mMessages这个对象,我们可以把它理解为是待执行的message队列,该队列是按照when的时间排序的且第一个消息是最先执行。
代码中第4行中有三个条件:如果mMessages对象为空,或者when为0也就是立刻执行,或者新消息的when时间比mMessages队列的when时间还要早,符合以上一个条件就把新的msg插到mMessages的前面 并把next指向它,也就是msg会插进上图中队列的最前面,等待loop的轮询。
如果上面的条件都不符合就进入else代码中,我们可以看到17行是有个for的死循环遍历已有的message对象,其中第20行中有个if语句when < p.when when是新消息的执行时间,p.when的是队列中message消息的执行时间,如果找到比新的message还要晚执行的消息,就执行
msg.next = p;
prev.next = msg;
也就是把插到该消息的前面,优先执行新的消息。
到这里,这个消息队列的入队规则就讲完了,蛮简单的,如果有面试官问到这个我们一定要流利的说出来。

Handler中MessageQueue的enqueueMessage笔记相关推荐

  1. Handler ,MessageQueue 的Looper中epoll监听的fd

    hi,同学们大家好! 这些天有学员再群里问起了Handler中有个数据监听相关问题,学员有的认为Handler数据传递是靠流传递,误认为是epoll中监听的fd进行传递的,这个其实有必要更正这个学员的 ...

  2. 【Android 异步操作】Handler 机制 ( MessageQueue 消息队列的阻塞机制 | Java 层机制 | native 层阻塞机制 | native 层解除阻塞机制 )

    文章目录 一.MessageQueue 的 Java 层机制 二.MessageQueue 的 native 层阻塞机制 三.MessageQueue 的 native 层解除阻塞机制 三.Messa ...

  3. Android 线程4件套 MessageQueue Message Looper Handler之MessageQueue

    看了前面Looper章节之后,也许还是云里雾里的,但至少了解到Looper中每个Looper干了什么事,其中我们MessageLooper留下了两个问题.主要问题是Looper如何从MessageQu ...

  4. Android 消息处理机制(Looper、Handler、MessageQueue,Message)

    原文:[简书原文](http://www.jianshu.com/p/02962454adf7)> 另外本人自己开了开了个人博客 fanmingyi.cn 不定时更新[跳转到个人博客](http ...

  5. 了解Handler,Looper, MessageQueue,Message的工作流程

    Handler的作用 异步通信,消息传递 Handler的基本用法 Handler的用法,示例1.(子线程向主线程发送消息) public class HandlerActivity extends ...

  6. Android Handler中的handleMessage方法和post方法之源码剖析

    我们都知道,在子线程中进行UI操作(更新UI控件)包括以下四种方法: 1.Handler的handlerMessage()方法. 2.Handler的post()方法. 3.View的post()方法 ...

  7. 深入理解异步消息处理机制Message,handler,MessageQueue,looper

    本文转自: http://www.cyqdata.com/android/article-detail-36658 本篇深入理解Android消息队列原理篇,将为您讲述Android世界中的消息机制, ...

  8. Android异步处理三:Handler+Looper+MessageQueue深入详解

    本博文地址:http://blog.csdn.net/mylzc/article/details/6771331 转载请注明出处 Android异步处理系列文章索引 Android异步处理一:使用Th ...

  9. 【Android 异步操作】Handler 机制 ( MessageQueue 空闲任务 IdleHandler 机制 )

    文章目录 一.MessageQueue 空闲任务 IdleHandler 机制 二.MessageQueue 中空闲任务 IdleHandler 相关源码 一.MessageQueue 空闲任务 Id ...

最新文章

  1. 2019 年,19 种方法让自己成为更好的 Node.js 工程师
  2. C#创建、安装一个Windows服务
  3. pygame中使用事件扫描实现对按键的检测以及小游戏的编写
  4. oracle idcs,Oracle Spatial函数SDO_CS.Transform(value)结果非常慢
  5. IDEA 底部工具栏没有 Version Control 解决办法
  6. 利用cors,实现js跨域访问Tomcat下资源
  7. 计算2的幂(信息学奥赛一本通-T1037)
  8. 封装属性_「Python基础学习」之封装大法
  9. html三张图片的轮播代码_vue写了个轮播图
  10. C++类的包含编译模型
  11. 产业链人士:苹果明年将推出OLED屏iPad
  12. [Caffe]:关于 Error parsing text-format Caffe.NetParameter: xxx.xx : Expected interger or identifier.
  13. 《深入理解Java虚拟机》Java内存区域与内存溢出异常
  14. FZU 2129 子序列个数 (递推dp)
  15. snmp trap 与snmp相关介绍、安装、命令以及Trap的发送与接收java实现
  16. log4j错误log4j:WARN No appenders could be found for logger
  17. php interface类,类相关的关键字 - interface
  18. 美国访问学者生活之行-公交及考驾照
  19. 为什么到苹果官方售后更换电池,要求用户退出ID呢?
  20. 64位计算机可以安装32位软件,【64位可以安装32位系统】64位安装32位的软件_64位系统改装32位系统...

热门文章

  1. 网易新闻:无屌丝,不江湖
  2. PCB Layout设计规范-通用篇
  3. Cadence OrCAD 16.6 原理图导出带标签pdf(免费软件版)
  4. python爬虫入门:搜索和批量下载图片
  5. Access to XMLHttpRequest at ‘http://xx‘ from origin ‘http://xx‘ has been blocked by CORS policy:
  6. 小米手机解锁BL以及获取Root权限(开发版)
  7. st-link下载程序配置时点击setting程序闪退
  8. 泰凌微BDT烧录软件遇到的问题
  9. 内部版本7600无法安装ie9浏览器
  10. vue模板字符串中点击事件传递参数