笔记:安卓App消息处理机制
内容简述
类似Binder机制,MessageQueue、Looper也有底层的C++实现,涉及文件管道和驱动等。
以下仅从Java层的Looper、Handler和MessageQueue等相关类型的源码来分析线程消息处理的机制。
MessageQueue的创建
Looper用来创建和启动消息队列。
Looper对象和线程绑定是通过ThreadLocal实现的。
它提供了各种getter方便获取线程关联的MessageQueue和Looper对象。
Looper.prepare();
Looper.prepareMainLooper();
线程通过执行Looper.prepare()来创建关联的MessageQueue。
主线程则调用prepareMainLooper()来创建主线程关联的Looper,方便其它线程向主线程发消息。
Looper.prepare()
它新建了Looper对象,以ThreadLocal存储它,所以和当前线程绑定。
构造函数中创建了消息队列:
private Looper(boolean quitAllowed) {
mQueue = new MessageQueue(quitAllowed);
mThread = Thread.currentThread();
}
MessageQueue的创建
// MessageQueue.java
private long mPtr;
MessageQueue(boolean quitAllowed) {
mQuitAllowed = quitAllowed;
mPtr = nativeInit();
}
nativeInit()调用C++代码创建底层的C++MessageQueue对象。
有了MessageQueue对象以后,接着需要开启消息循环,使用关联的Handler来发送、处理消息了。
消息循环
MessageQueue有点像一个阻塞队列,它提供MessageQueue.next()用来从队列中取出一个Message对象。
若没有消息则调用会阻塞。
Looper.loop()
Looper.loop()用来开启对MessageQueue的取消息操作的无限循环。
public static void loop() {
final Looper me = myLooper();
...
final MessageQueue queue = me.mQueue;
...
for (;;) {
Message msg = queue.next(); // might block
if (msg == null) {
// No message indicates that the message queue is quitting.
return;
}
...
msg.target.dispatchMessage(msg);
...
msg.recycleUnchecked();
}
}
可以看到,loop()的操作就是无限从queue中调用next()获取一个新Message对象,然后执行dispatchMessage来处理它。
MessageQueue.next()
nativePollOnce()用来检查队列中是否有新的消息。
参数nextPollTimeoutMillis表示在暂无消息时此次检查过程需要休眠的时间:
- 等于-1:表示无限等待,直到被其它线程唤醒。
- 等于 0:继续循环检查队列。
- 大于 0:以nextPollTimeoutMillis的毫米数等待。
使用for (;
笔记:安卓App消息处理机制的更多相关文章
- Android应用开发学习笔记之多线程与Handler消息处理机制
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 和JAVA一样,Android下我们可以通过创建一个Thread对象实现多线程.Thread类有多个构造函数,一般通 ...
- Android应用程序消息处理机制笔记
看老罗的Android源码情景分析学习的时候,边抄边理解再总结.希望能为面试提供点帮助吧. 1.Android应用程序是通过消息来驱动,Android应用程序每一个线程在启动时,都可以首先在内部创建一 ...
- 一文了解安卓APP逆向分析与保护机制
"知物由学"是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道."知物 ...
- Android源码阅读笔记二 消息处理机制
消息处理机制: .MessageQueue: 用来描述消息队列2.Looper:用来创建消息队列3.Handler:用来发送消息队列 初始化: .通过Looper.prepare()创建一个Loope ...
- Android异步消息处理机制
安卓子线程无法直接更改UI,所以需要异步消息处理机制来解决 <?xml version="1.0" encoding="utf-8"?><Li ...
- Android消息处理机制(Handler 与Message)---01
一.handler的使用场景为么会有handler?(部分内容图片摘自http://www.runoob.com/w3cnote/android-tutorial-handler-message.ht ...
- Android应用程序消息处理机制(Looper、Handler)分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6817933 Android应用程序是通过消息来 ...
- 《Android进阶》之第三篇 深入理解android的消息处理机制
Android 异步消息处理机制 让你深入理解 Looper.Handler.Message三者关系 android的消息处理机制(图+源码分析)——Looper,Handler,Message an ...
- Android多线程----异步消息处理机制之Handler详解
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
随机推荐
- javascript Hoisting变量提升
1. 看人家举的两个例子,我认为这里的判断是否定义: !var 其实就是 指是否在函数function里面定义了.只有在funciton里面定义了了,js才hoist到最上面去找这个变量的值,否则就按 ...
- PHP整理--PHP语法
PHP是一门动态交互的计算机语言,动态交互都需要服务器; 我们所了解过的静态交互都有:html,css,js: 1.我们学习PHP需要服务器,当我们没有服务器的条件时,PHPstudy给我们提供了一个 ...
- SNORT入侵检测系统
SNORT入侵检测系统 YxWa · 2015/10/09 10:38 0x00 一条简单的规则 alert tcp 202.110.8.1 any -> 122.111.90.8 80 (ms ...
- P2158 [SDOI2008] 仪仗队(欧拉函数模板)
题目描述 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图 ...
- 计数排序之python
话说,一口气不能吃个胖子, 一次性 学习 计数排序, 也确实容易消化不良. 下面,我们逐步学习下计数排序. 1. 已知一个简单列表 l1 = [5, 4, 3], 分析下这个列表的情况 5 > ...
- oracle xe在centos下的安装(更)
更:重新弄了一下,就两个地方要注意,一是hosts文件的主机域名解析,而是profile文件配置,需要从oracle文件里复制过去在profile最下面添加就行了 注:下面方法反正我是失败了,好像xe ...
- windows 多网卡路由设置
1.问题 windows操作系统,双网卡连接内外网,配置路由使内网请求走内网网卡,外网请求走外网网卡 2.网络参数 内网网卡 IP:172.22.25.152 mask: 255.255.255.0 ...
- 2019.03.28 bzoj3326: [Scoi2013]数数(数位dp)
传送门 题意: 一个人数数,规则如下: 确定数数的进制B 确定一个数数的区间[L, R] 对于[L, R] 间的每一个数,把该数视为一个字符串,列出该字符串的所有连续子串对应的B进制数的值. 对所有列 ...
- python实现异步调用函数
import time from concurrent.futures import ThreadPoolExecutor def RunBenchmark(url): print('GET %s' ...
- jenkins 使用Git 报错:SSL certificate problem: self signed certificate in certificate chain
在启动java的脚本上执行 增加参数: -Dorg.jenkinsci.plugins.gitclient.GitClient.untrustedSSL=true 即可!!