Handler 作为Android 的常客,同时在安卓系统上占着重大地位,就拿Activity 的生命周期、事件分发来说都是由Handler 来处理消息,并分发消息。
1.Handler 是什么?
Android 消息处理机制 (发送消息 和 处理消息)以及 UI 更新机制 (main 线程 和子线程[不能更新 UI] 交互)
A Handler allows you to send and process Message and Runnable objects associated with a thread’s MessageQueue.
大概翻译:
Handler 允许 你去发送和处理 消息或者是发送处理绑定在线程消息队列中的runnable对象,每一个Handler实例都联系到一个单一的线程和那个线程的消息队列中。当创建一个新的Handler,他将绑定到这个线程或者是创建Hanlder的线程的消息队列。从这一点上来看,它会传递信息和消息队列的rannables并在消息弹出消息队列时执行它们。Handler有两个主要的用途:1是调度消息和runnables在未来执行的时间;2是为不同线程中所进行的活动排队。
2.为什么要用 handler ?
3.为什么要通过 Handler 更新 UI 呢?
- 防止多个线程去更新 UI 造成错乱现象
- 加锁影响效率
4.使用 Handler 遇到的问题
- 内存泄漏
- 消息阻塞,导致 ANR
- 子线程不通过Handler 更新UI,会抛异常 (短时间内不会抛出异常 原因:framework api 要判断 sdk >11)
- 子线程创建 Handler 没有传 Looper 对象
5.如何实现一个与线程相关的 Handler
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}
6.HandlerThread 又是什么?
是 Google 为了 简化 异步操作导致 Looper = null 情况下 封装的一个 线程类
HandlerThread handlerThread = new HandlerThread("");
Handler handler = new Handler(handlerThread.getLooper()){
@Override
public void handleMessage(Message msg) {
//异步操作 耗时操作
}
};
7. Android中更新UI的几种方式
- Handler post //源码分析 同样发送 Message 对象
- Handler 发送 Message 回调 handleMessage();
- runOnUiThread(Runnable r); // 内部也采用 Handler 机制
- View.post();// 内部也采用 Handler 机制
好了,到此结束~~~
下篇从源码分析Android 消息处理机制