Android Handler机制
本博客是笔者在阅读<Android 内核剥析>后,有感而写.强烈建议读者去阅读这本书.
要说handler机制,handler并不是猪脚.真正的猪脚是Android异步消息处理现程.
异步消息处理线程:
一般线程在处执行完run()后就会结束.而异步消息处理线程则一个 while(true)循环.不断的从当前线程中取出消息,又不断的处理消息.如果没有消息,就阻塞住,等待队列有新的消息在继续处理.
使用异步消息处理线程的场景:
1.任务需要常驻,比如处理用户交互的事件.Android中典型的就是ui交互
2.任务需要根据外部传递的信息做具体的处理.
异步消息处理线程的一般实现思路:
1.每个异步线程内部都包含一个消息队列(MessageQuenue).消息队列的一般原则是先进先出.即先进入的消息先被处理.
2.线程的主体是个while(true)循环,不断的从当前线程中取出消息,调用消息对象的回调执行相应的函数处理消息.
3.其他外部线程可以向该线程发送消息.线程内部的消息队列在读写消息是必须加锁.
几乎所有操作系统都要实现自己的异步消息处理线程.现在让我看Android如何实现的.具体也就是完成上面的三步.
粗粒度讲解下Android异步消息处理线程的大致过程.
线程可以含有一个或多个Handler向该Handler所隶属的线程里的MessageQuenue发送消息.该线程内的唯一的Loop消息轮询器会不断的轮询消息队列的消息,取出消息调用该消息的handlerMessage()回调方法
处理消息.
这里主要的实现就是与这四个相关的类 Handler Loop Message MessageQuenue.
Loop(消息轮询器)
一个线程如果要成为异步消息处理线程.就必须调用Loop.prepare().该方法内部会给Loop类的ThreadLocal 型变量(即线程级变量) 设置一个Loop对象.Lopp的构造函数就为该线程创建一个MessageQuenue对象.
这里要注意Loop.prepare()只能在线程内被调用一次.因为该方法会间接创建一个MessageQuenue对象.而一个线程内只能有一个消息队列.
Loop还有一个方法是loop().是让loop开始轮询消息队列处理消息.
以上所提到的两个关于Loop的方法详细可见<Android 内核剥析>P 44.
MessageQuenue
该类是消息队列.采用排队的方式对消息进行处理.即先进先出的原则.当然如果消息本身指明了该消息执行的事件,则必须等到该时刻再处理该消息.消息队列中的消息用Message来表示
MessageQuenue类内部并没有存储消息.而是在底层的C代码中存储了消息.以便来增加效率.
MessageQuenue 有两个最主要的方法就是取出 和写入消息.next() enquenceMessage().这两个方法的实现都采用了jni技术.具体可见<Android 内核剥析>P 44.
Handler
对消息队列发送消息和具体如何处理就是通过该类完成.注意handler只会给其所在线程的消息队列的MessageQuence发送消息.每个Message对象内部都有Handler型变量target指向将它发送出去的handler对象.
Loop通过该变量找到对应的handler回调其handMessage()来处理消息.
通过以上三个类的描述相信大家对Android的异步消息处理线程,handler机制一定有很深刻的了解了吧.从此妈妈再也不担心我不会跟新UI,不会用Handler了.
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。