Android消息机制源码解析

Android消息机制源码解析

ID:41122041

大小:126.50 KB

页数:6页

时间:2019-08-16

Android消息机制源码解析_第1页
Android消息机制源码解析_第2页
Android消息机制源码解析_第3页
Android消息机制源码解析_第4页
Android消息机制源码解析_第5页
资源描述:

《Android消息机制源码解析》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、我写这篇日志的初衷,是想让每个初学Android应用开发的同学们(高手就飘过吧~~)弄明白Android消息机制的原理和底层实现方式,至于大家能否对Android消息机制彻底弄明白,纯粹是对我个人表达能力的一次巨大挑战。因为Android事件机制和代码实现,对已经具备Java或C++语言语法基础的人来讲,其实是并不难理解的。在我看来,消息机制有2大应用场合,一是GUI程序设计,比如我们用鼠标在一个程序界面上实施鼠标点击,拖拽,键盘输入等动作,程序一般便会执行预期的效果。二是后台服务程序,没有程序界面的那种。比如说

2、一些银行金融产品软件,电信设备的操作维护平台软件等。我们一次网上银行汇款,一次拨打电话行为,都会激发大量的系统内部消息和消息处理动作,这类系统往往还会添加分布式组件模块,屏蔽消息跨平台的发送和接收机制,但其核心设计思想仍基于GUI程序的消息处理模型。既然如此,我们从GUI程序说起吧。在界面上,一个看似简单的操作背后,其实隐藏了GUI程序设计核心的三要素:线程,消息队列和消息响应函数。当然了,还有些具体的细节过程,比如如何发送消息,取得消息,执行消息响应函数,消息循环的停止等。为便于更好的说明这三要素,我把线程,消

3、息队列和消息响应函数,变通成一个邮局的工作流,可以把邮递员看成是线程,邮件看成是消息,那么邮筒就是一个消息队列了,邮递员把邮件投递到邮件接收者的过程看成消息的响应函数。邮局的工作流程大概如下图:简单说明:头天路人甲,乙,丙分别向邮局的邮筒里投递了3封邮件:mail1,mail2,mail3,拼命三郎今早上班时和往常一样从邮筒中取邮件时发现了这3封邮件,然后骑上自备的电炉乐呵乐呵的按照mail1,mail2,mail3上的地址送到接收人手里,然后再返回邮件取新的邮件,运气不错,拼命三郎没取到新的邮件,可以好好歇歇了

4、^_^。但我们还不能歇息,继续探究拼命三郎取送邮件的过程,和Android消息机制的关联性,探究完了我们也就明白Android消息机制的来龙去脉了。下面掌声有请Android消息机制的三大部件隆重登场(鼓掌~~~)Thread:大家好,我是线程,关于我的身世我在这里没什么好讲的,有兴趣的同学可以参阅操作系统的原理方面的书籍和资料,里面会有我前世今生的详细介绍。平常,大家没少跟我打交道。诸位最愿意干的事情就是在我的Run方法里写一个带while循环的函数,让我不停地在这个函数里面兜圈。老实讲,虽然这样让我很累,和感

5、觉些许的无聊,但这是我的职责所在——毫无怨言的执行Run方法的代码指令,我的这个特点和上图中的整天不停取,送邮件的拼命三郎很像吧。Looper:各位同学好,我的名字大伙都认识的,大家猜猜我是什么循环者?xx:等等,这个听上去很熟啊,Thread不是经常在Run方法里做循环的嘛?!你能说讲你和Thread是什么关系?Looper继续道:xx同学将来一定是块写程序的料,思维很有想象力嘛。在我内部,确实有一个叫loop的消息循环函数和一个消息队列。我再透露一点,在我的一个实例产生时,它就被上天安排和一个Thread男绑

6、定在一起的时候,可以说是真正意义上的执子之手白头到老了。从那刻起,我便拥有了Thread一生,Thread对我也是不离不弃。为什么?一个线程永远只能拥有一个Looper对象,同时Thread在run方法中会进入我的loop消息循环。不管白天和黑夜,Thread做的事情只有一件:永不停歇地从我的消息队列里获取消息,然后执行消息的target定义的行为——这就是传说中的消息循环,直到程序主动退出循环。执行消息的target定义的行为,这点和拼命三郎,根据邮件的收信人的地址送信一样啊,不同的接收人地址,决定了送邮件的

7、路径和路程是不一样的。同样的,不同的消息其处理方式也是不一样的。Handler:大家辛苦了,久等了,我接着刚才Looper说到的—消息的target说起,消息的target实际的扮演者就是我啦。从我的名字也显现了我的身份——处理者,即消息响应处理者。还有一点:大家知道Looper中消息队列中是怎么来的吗?嗯,对,答案是通过我投递的。那我是怎么拿到Looper的消息队列的呢?其实,在new一个我的实例的时候,会有个Looper实例也跟我绑定一下,这样通过我发送的消息就自动添加到对应Looper的消息队列了,通过

8、上面Looper的自我介绍,也就决定了这条消息是发个那个线程的,是吧^_^。通过上面三大部件的一段真情对白,相信大家对Android事件机制已经有了清晰的感性认识吧。下面我们再从代码实现的角度来剖析:首先,看看一个Looper对象如何跟一个Thread对象绑定的,这里我拿HandlerThread作为解剖标本,它的类是AndroidSDK中自带Looper的线程子类,重点

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。