Handler中MessageQueue的enqueueMessage笔记
今天心血来潮,又默默的想着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;
}
prev.next = msg;
也就是把插到该消息的前面,优先执行新的消息。
Handler中MessageQueue的enqueueMessage笔记相关推荐
- Handler ,MessageQueue 的Looper中epoll监听的fd
hi,同学们大家好! 这些天有学员再群里问起了Handler中有个数据监听相关问题,学员有的认为Handler数据传递是靠流传递,误认为是epoll中监听的fd进行传递的,这个其实有必要更正这个学员的 ...
- 【Android 异步操作】Handler 机制 ( MessageQueue 消息队列的阻塞机制 | Java 层机制 | native 层阻塞机制 | native 层解除阻塞机制 )
文章目录 一.MessageQueue 的 Java 层机制 二.MessageQueue 的 native 层阻塞机制 三.MessageQueue 的 native 层解除阻塞机制 三.Messa ...
- Android 线程4件套 MessageQueue Message Looper Handler之MessageQueue
看了前面Looper章节之后,也许还是云里雾里的,但至少了解到Looper中每个Looper干了什么事,其中我们MessageLooper留下了两个问题.主要问题是Looper如何从MessageQu ...
- Android 消息处理机制(Looper、Handler、MessageQueue,Message)
原文:[简书原文](http://www.jianshu.com/p/02962454adf7)> 另外本人自己开了开了个人博客 fanmingyi.cn 不定时更新[跳转到个人博客](http ...
- 了解Handler,Looper, MessageQueue,Message的工作流程
Handler的作用 异步通信,消息传递 Handler的基本用法 Handler的用法,示例1.(子线程向主线程发送消息) public class HandlerActivity extends ...
- Android Handler中的handleMessage方法和post方法之源码剖析
我们都知道,在子线程中进行UI操作(更新UI控件)包括以下四种方法: 1.Handler的handlerMessage()方法. 2.Handler的post()方法. 3.View的post()方法 ...
- 深入理解异步消息处理机制Message,handler,MessageQueue,looper
本文转自: http://www.cyqdata.com/android/article-detail-36658 本篇深入理解Android消息队列原理篇,将为您讲述Android世界中的消息机制, ...
- Android异步处理三:Handler+Looper+MessageQueue深入详解
本博文地址:http://blog.csdn.net/mylzc/article/details/6771331 转载请注明出处 Android异步处理系列文章索引 Android异步处理一:使用Th ...
- 【Android 异步操作】Handler 机制 ( MessageQueue 空闲任务 IdleHandler 机制 )
文章目录 一.MessageQueue 空闲任务 IdleHandler 机制 二.MessageQueue 中空闲任务 IdleHandler 相关源码 一.MessageQueue 空闲任务 Id ...
最新文章
- 2019 年,19 种方法让自己成为更好的 Node.js 工程师
- C#创建、安装一个Windows服务
- pygame中使用事件扫描实现对按键的检测以及小游戏的编写
- oracle idcs,Oracle Spatial函数SDO_CS.Transform(value)结果非常慢
- IDEA 底部工具栏没有 Version Control 解决办法
- 利用cors,实现js跨域访问Tomcat下资源
- 计算2的幂(信息学奥赛一本通-T1037)
- 封装属性_「Python基础学习」之封装大法
- html三张图片的轮播代码_vue写了个轮播图
- C++类的包含编译模型
- 产业链人士:苹果明年将推出OLED屏iPad
- [Caffe]:关于 Error parsing text-format Caffe.NetParameter: xxx.xx : Expected interger or identifier.
- 《深入理解Java虚拟机》Java内存区域与内存溢出异常
- FZU 2129 子序列个数 (递推dp)
- snmp trap 与snmp相关介绍、安装、命令以及Trap的发送与接收java实现
- log4j错误log4j:WARN No appenders could be found for logger
- php interface类,类相关的关键字 - interface
- 美国访问学者生活之行-公交及考驾照
- 为什么到苹果官方售后更换电池,要求用户退出ID呢?
- 64位计算机可以安装32位软件,【64位可以安装32位系统】64位安装32位的软件_64位系统改装32位系统...
热门文章
- 网易新闻:无屌丝,不江湖
- PCB Layout设计规范-通用篇
- Cadence OrCAD 16.6 原理图导出带标签pdf(免费软件版)
- python爬虫入门:搜索和批量下载图片
- Access to XMLHttpRequest at ‘http://xx‘ from origin ‘http://xx‘ has been blocked by CORS policy:
- 小米手机解锁BL以及获取Root权限(开发版)
- st-link下载程序配置时点击setting程序闪退
- 泰凌微BDT烧录软件遇到的问题
- 内部版本7600无法安装ie9浏览器
- vue模板字符串中点击事件传递参数