在使用Android 手机下载软件时,通常都能在界面看到一个下载的进度条,用来表示当前软件下载的进度。 但Android 4.0 以后不能在UI 线程访问网络,子线程也不能更新UI 界面。 为了根据下载进度实行更新UI 界面,就需要用到Handler 消息机制来实现线程间的通信。
Handler 机 制 主 要 包 括4 个 关 键 对 象, 分 别 是 Message、 Handler、 Message-Queue、Looper。 下面对这4 个关键对象进行简要介绍。
(1)Message
Message 是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据。 Message 的what 字段可以用来携带一些整形数据,obj 字段可以用来携带一个Object 对象。
(2)Handler
Handler 就是“处理者”的意思,它主要用于发送消息和处理消息。 一般使用Handler 对象的sendMessage()方法发送消息,发出的消息经过一系列的辗转处理后,最终会传递到Handler 对象的handlerMessage()方法中。
(3)MessageQueue(www.xing528.com)
MessageQueue 是消息队列的意思,它主要用于存放通过Handler 发送的消息。 通过Handler 发送的消息会存在MessageQueue 中等待处理。 每个线程中只会有一个MessageQueue 对象。
(4)Looper
Looper 是每个线程中的MessageQueue 的管家。 调用Looper 的Looper()方法后,系统就会进入一个无限循环中,每当发现MessageQueue 中存在一条消息,就会将它取出,并传递到Handler 的handlerMessage()方法中。 此外,每个线程也只会有一个Looper 对象。 在主线程中创建Handler 对象时,系统已经创建了Looper 对象,所以不用手动创建Looper 对象;而在子线程中创建的Handler 对象,需要调用Looper.loop()方法开启消息循环。
整个Handler 消息处理流程,如图14-2 所示。
图14-2 异步消息处理原理图
从图14-2 可以清晰地看到整个Handler 消息机制处理流程。 Handle 消息处理需要在UI 线程创建一个Handle 对象,然后在子线程中调用Handle 的sendMessage()方法,接着这个消息会存放在UI 线程MessageQueue 中,通过Looper 对象取出MessageQueue中的消息,最后分发回Hanlder 的HandleMessage()方法中。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。