欢迎来到天天文库
浏览记录
ID:44947683
大小:305.50 KB
页数:113页
时间:2019-11-05
《Android消息机制之Handler,MessageQueue,Looper源码剖析》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、标准文案Android消息机制之Handler,MessageQueue,Looper源码剖析Android线程间通讯方式有很多,但是大部分内部实现其实都是handler。今天我们就来看看handler的内部实现机制,实现原理,实现细节。本文主要是为了搞清楚线程间的通讯,Message也可以用于进程间的通讯,在本文中不对此进行详细的讲解,浅尝辄止!后面如果有需要,我会补上Message的进程间通讯相关文章,敬请期待!本位我们分步骤对Handler消息机制进行分析,这样有条理一点,已更利于阅读。角色分析:Handler进程间通讯主要关
2、联了Thread,ThreadLocal,Handler,Message,MessageQueue,Looper,,这几个类在内。我们先看看这几个类各自在这个实现工程中扮演者什么样的角色!Thread:整个机制产生的意义,所有这个机制就是为Thread服务!Looper的创建是为Thread而创建,其实是Thread持有。Handler使用的Looper是由Thread提供!ThreadLocal:Thread属性的存储者,内部维护一个ThreadLocalMap,其中存放了Thread的所有属性,Looper就是存放在这儿。Han
3、dler:消息的发起者,发出一个消息。消息的处理者,消息处理的时间到了对该消息进行处理。必须有一个Looper,通过操作Looper持有的MessageQueue实现消息的发送,当Looper通知处理Message的时候,对Message进行处理。大全标准文案Message:数据和信号携带者,携带数据进行传递。处理时机决定者,通过when属性决定消息的处理时间。消息队列的产生者,将一个个的message对象串联起来,形成消息队列。MessageQueue:消息存放者,存放了一个消息队列,有消息进来的时候安插在指定的位置,需要处理的时
4、候将消息取出来。消息排队者,将消息按处理的时间进行存放,让消息排队进行处理。Looper:运行机制全局掌控者,让整个机制活动起来的关键人员,将所有角色联系起来,根据具体实现进行调度,完成整个机制的任务。内部持有一个MessageQueue,Handler通过关联Looper,联系上MessageQueue。大体的运转结构了解了这些类在整个任务中充当的角色何彼此之间的联系之后,我们来看看他们大体都做了些什么工作,让整个机制运转起来。Handler通过sendMessage方法,将Message发送出去,MessageQueue通过qu
5、eueMessage方法将消息存插入到消息队列中等待被处理。Looper通过loop方法在特定的时间到MessageQueue中将消息取出来,回调Handler的dispatchMessage方法将消息交给Handler处理。具体为什么就将数据在线程之间传递成功了呢?通过第2点,我们大体了解了整个机制的原理,但是这样做为什么就能实现线程间数据的传递呢?这个问题很关键,在我们源代码分析完了之后再来进行讲解,这儿先不说。大全标准文案源代码剖析:下面我们对源代码进行剖析,然后再来看看上面提到的理论和问题,整个消息机制就完全理解掌握了!Ha
6、ndler源码分析:publicclassHandler{privatestaticfinalbooleanFIND_POTENTIAL_LEAKS=false;privatestaticfinalStringTAG="Handler";//当前handler所在线程的looperfinalLoopermLooper;//跟looper对应的消息队列finalMessageQueuemQueue;//处理消息的回调finalCallbackmCallback;//决定处理消息的方式同步的还是异步的finalbooleanmAsync
7、hronous;大全标准文案IMessengermMessenger;/***通过设置这个接口去处理消息,就不需要再定义一个Handler的子类*/publicinterfaceCallback{publicbooleanhandleMessage(Messagemsg);}/***Subclassesmustimplementthistoreceivemessages.*Message和Handler都没有callback才会调用处理消息,这儿啥也没做,留着口给子类去完成了*/publicvoidhandleMessage(Mes
8、sagemsg){}/***处理系统消息*Handlesystemmessageshere.*/publicvoiddispatchMessage(Messagemsg){大全标准文案//如果msg有回调就交给msg处理if(msg.
此文档下载收益归作者所有