Handler内部实现原理
# 1. Handler实现机制
- Message对象,表示要传递的消息,链表实现的消息池,用于重复利用,避免创建大量消息造成OOM
- MessageQueue对象,存放消息对象的消息队列
- Looper对象负责管理当前线程的消息队列(MessageQueue),循环检查消息对类并取出消息
- Handler对象负责把消息push到消息队列中,以及接收Looper从消息队列中取出的消息,通过
handleMessage
处理消息
Android启动程序时会在UI线程创建一个MessageQueue,Handler绑定了MessageQueue,在Handler创建时自动创建
# 1.1 消息机制原理
创建Message对象之后,在Handler中发送消息,将消息存储至MessageQueue中。Looper消息管理器从MessageQueue中取出消息,调用Handler来处理消息,更新UI。Looper将处理过后的Message放入到Message Pool中进行复用。
# Message-数据载体
- 可作为处理线程间通讯的数据单元,通过message来封装携带数据
创建对象:Message.obtain(what)
复用连接池中的对象,比直接new
效率高
public int what; // id标识
public int arg1; // 保存int数据
public int arg2;
public Object obj; // 保存任意类型数据
public long when; // 记录应该被处理的是时间值
Handler target; // 用来处理消息的Handler对象,就是发送消息的Handler
Runnable callback; // 处理消息的回调器,一般为空
Message next; // 链表的Next节点
// 消息池,最大为50个msg
private static Message sPool;
private static int sPoolSize = 0;
private static final int MAX_POOL_SIZE = 50;
// 从全局池中返回一个新的 Message 实例。允许我们在许多情况下避免分配新对象。
public static Message obtain() {
synchronized (sPoolSync) {
if (sPool != null) {
Message m = sPool;
sPool = m.next;
m.next = null;
m.flags = 0; // clear in-use flag
sPoolSize--;
return m;
}
}
return new Message();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Runnable对象的run方法什么时候在分线程执行?
- 只有将Runnable传给Thread的构造时
new Thread(new Runnable() {
@Override
public void run() {
// 在分线程中执行
}
}).start()
1
2
3
4
5
6
2
3
4
5
6
# Handler-发送消息、处理消息、移除消息
- [ ] 发送消息流程
public final boolean sendMessage(@NonNull Message msg) {
return sendMessageDelayed(msg, 0); // 调用延迟消息,延迟为0
}
1
2
3
2
3
# MessageQueue-存储消息
以Message的when排序的优先级队列
# Looper
编辑 (opens new window)
上次更新: 2021/06/17, 17:05:09