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了.
     
   
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值