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 机制的一些了解。希望能与大家多多交流。

更多相关文章

  1. android的UI操作单线程模型理解
  2. android handler 多线程demo
  3. android JNI层线程回调Java函数
  4. Android 使用Thread+Handler实现非UI线程更新UI界面
  5. Android异步加载图像小结(含线程池,缓存方法)[转]

随机推荐

  1. Android 使用Android Studio + Gradle 或
  2. Android studio使用笔记。。。
  3. 【转】Android ADB命令集
  4. android环境变量设置以及adb的常用命令
  5. Android笔记三(相对布局)
  6. android:ellipsize的使用
  7. 【Android】线性布局和相对布局的比较
  8. Android布局文件中的各种属性
  9. Android 模拟器 无法上网问题
  10. android布局属性