Android Handler 机制详解

Handler 机制是 Android 多线程开发中必不可少的一部分。它的常见使用场景在子线程中更新 UI 界面。开发过 Android 项目的人都应该知道,在 Android 主线程中不能进行耗时操作,所以一些耗时的(网络请求操作,大文件处理等)都应该在子线程中进行,但是由于 Android 的主线程是不安全的,不能通过子线程中进行 UI 操作。这时 Handler 机制就成为了子线程更新 UI 的一座桥梁。

学习 Handler 机制,首先我们需要了解它的实现原理。在其实现过程中,Handler 、Message、MessageQue、Looper 是必不可少的四个要素。在这我先简要的描述一下 Handler 机制的工作原理:由 Handler 将一个 Message 插入到 MessageQue 中(sendMessage()/postMessage()),然后通过 Looper 对象轮询取出 MessageQue 中的 Message 对象(next()方法)。再由实现Handler 对象的 onHandMessage()方法来分发处理 Message 对象携带的相应事件。

Handler 

不仅是消息的发送方,同时也是消息的处理方。它通过 sendMessage() postMessage()等方法来将消息插入到 MessageQue 中然后通过 onHandMessage()来接收并处理。

Message

一个message对象包含一个自身的描述信息和一个可以发给 Handler 的任意数据对象。这个对象包含了两个int 类型的 extra 字段和一个object类型的 extra 字段。利用它们,在很多情况下我们都不需要自己做内存分配工作。

实例化Message最好的方法是调用Message.obtain()或Handler.obtainMessage()(实际上最终调用的仍然是Message.obtain()),因为这两个方法都是从一个可回收利用

的对象池中获取Message的。

MessageQue

MessageQueue是用来存放Message的集合,并由Looper实例来分发里面的Message对象。


Looper

Looper 是线程用来运行消息轮询的类。默认情况下,线程并没有与之关联的 Looper,可以通过在线程中调用Looper.prepare() 方法来获取,并通过Looper.loop() 无限循环地获取并分发 MessageQueue 中的消息,直到所有消息全部处理。

在获取到 MessageQue 实例后,Looper 对象开启死循环,通过调用 next()方法来读取 MessageQue 中的消息。如果没有消息 Looper 会处于休眠状态知道有下一个消息进入。(这样会避免了 CPU 的浪费)。

以上就是我个人对 Handler 机制的一些了解。希望能与大家多多交流。

你可能感兴趣的:(记录)