首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
移动开发
> 详细
Android Handler机制
时间:
2015-05-25 10:02:45
阅读:
161
评论:
0
收藏:
0
[点我收藏+]
标签:
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了.
Android Handler机制
标签:
android handler
原文地址:http://blog.csdn.net/javamu/article/details/45959225
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
关闭苹果IOS app自动更新
2021-07-29
开发一个即时通讯App
2021-07-28
iOS 跳转App Store进行评分
2021-07-26
诺基亚短信生成!太好玩了
2021-07-26
【Azure 应用服务】App Service 配置 Application Settings 访问Storage Account得到 could not be resolved: '*.file.core.windows.net'的报错。没有解析成对应中国区 Storage Account地址 *.file.core.chinacloudapi.cn
2021-07-26
Android系统编程入门系列之界面Activity响应丝滑的传统动画
2021-07-26
uniapp h5,app两端复制文本
2021-07-22
uni-app滚动视图容器(scroll-view)之监听上拉事件
2021-07-21
新型横向移动工具原理分析、代码分析、优缺点以及检测方案
2021-07-19
Android系统编程入门系列之界面Activity交互响应
2021-07-19
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!