第10 章 Android 的消息机制.pdf

  1. 1、本文档共20页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第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

文档评论(0)

yaocen + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档