- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第10 章 Android 的消息机制
第10 章 Android 的消息机制
本章所要讲述的内容是 Android 的消息机制。提到消息机制读者应该都不陌生,在日
常开发中不可避免地要涉及这方面的内容。从开发的角度来说,Handler 是Android 消息机
制的上层接口,这使得在开发过程中只需要和Handler 交互即可。Handler 的使用过程很简
单,通过它可以轻松地将一个任务切换到Handler 所在的线程中去执行。很多人认为Handler
的作用是更新UI ,这的确没错,但是更新UI 仅仅是Handler 的一个特殊的使用场景.具体
来说是这样的:有时候需要在子线程中进行耗时的I/O 操作,可能是读取文件或者访问网
络等,当耗时操作完成以后可能需要在UI 上做一些改变,由于Android 开发规范的限制,
我们并不能在子线程中访问UI 控件,否则就会触发程序异常,这个时候通过Handler 就可
以将更新UI 的操作切换到主线程中执行。因此,本质上来说,Handler 并不是专门用于更
新UI 的,它只是常被开发者用来更新UI 。
Android 的消息机制主要是指 Handler 的运行机制,Handler 的运行需要底层的
MessageQueue 和Looper 的支撑。MessageQueue 的中文翻译是消息队列,顾名思义,它的
内部存储了一组消息,以队列的形式对外提供插入和删除的工作。虽然叫消息队列,但是
它的内部存储结构并不是真正的队列,而是采用单链表的数据结构来存储消息列表。Looper
的中文翻译为循环,在这里可以理解为消息循环。由于MessageQueue 只是一个消息的存储
单元,它不能去处理消息,而Looper 就填补了这个功能,Looper 会以无限循环的形式去查
找是否有新消息,如果有的话就处理消息,否则就一直等待着。Looper 中还有一个特殊的
概念,那就是 ThreadLocal,ThreadLocal 并不是线程,它的作用是可以在每个线程中存储
数据。我们知道,Handler 创建的时候会采用当前线程的Looper 来构造消息循环系统,那
么Handler 内部如何获取到当前线程的Looper 呢?这就要使用ThreadLocal 了,ThreadLocal
可以在不同的线程中互不干扰地存储并提供数据,通过ThreadLocal 可以轻松获取每个线程
的Looper 。当然需要注意的是,线程是默认没有Looper 的,如果需要使用Handler 就必须为
第 10 章 Android 的消息机制
线程创建Looper 。我们经常提到的主线程,也叫UI 线程,它就是ActivityThread,ActivityThread
被创建时就会初始化Looper,这也是在主线程中默认可以使用Handler 的原因。
10.1 Android 的消息机制概述
前面提到,Android 的消息机制主要是指 Handler 的运行机制以及 Handler 所附带的
MessageQueue 和 Looper 的工作过程,这三者实际上是一个整体,只不过我们在开发过程
中比较多地接触到Handler 而已。Handler 的主要作用是将一个任务切换到某个指定的线程
中去执行,那么Android 为什么要提供这个功能呢?或者说Android 为什么需要提供在某
个具体的线程中执行任务这种功能呢?这是因为Android 规定访问 UI 只能在主线程中进
行,如果在子线程中访问UI ,那么程序就会抛出异常。ViewRootImpl 对UI 操作做了验证,
这个验证工作是由ViewRootImpl 的checkThread 方法来完成的,如下所示。
void checkThread() {
if (mThread != Thread.currentThread()) {
throw new CalledFromWrongThreadException(
Only the original thread that created a view hierarchy can
touch its views.);
}
}
针对 checkThread
您可能关注的文档
最近下载
- 2025医保政策培训(1).pptx VIP
- 2025年北京市自来水集团有限责任公司校园招聘笔试备考试题及答案解析.docx VIP
- Fujifilm富士相机X-T5用户手册.pdf
- 口袋妖怪梦的光点全图鉴.docx
- 东南大学出版社孙志忠版《数值分析解析》习题答案.pdf VIP
- 痰诱导检查课件.pptx VIP
- 中南林业科技大学涉外学院《高等数学A》2025-2026学年期末考试试卷(A)卷.docx VIP
- 人工髋关节置换术术后护理.pptx VIP
- 中南林业科技大学《高等数学A》2025-2026学年期末考试试卷(A)卷.docx VIP
- 【浅析幼儿园安全教育现状及改进对策研究—以A幼儿园为例6000字】.docx VIP
原创力文档


文档评论(0)