Handler相关主要的类有如下几个:
Loop
Message
MessageQueue
ThreadLocal
Handler
下面是伪代码,可以更直观了解handler的调用流程
public class Handler{
Looper mLooper;//循环获取消息
MessageQueue mQueue;//消息队列
public Handler(){
mLooper = Looper.myLooper();
mQueue = mLooper.mQueue;
}
//Looper中循环中新取到的消息调用此方法
public void dispatchMessage(Message msg) {
handleMessage(msg);
}
//空实现,需要复写
public void handleMessage(Message msg){
}
//消息放到消息队列中
public boolean sendMessage(Message msg) {
MessageQueue queue = mQueue;
msg.taget = this;//注意把当前的handler赋给对应的msg
queue.enqueueMessage(msg, uptimeMillis);
}
}
public final class Looper {
//对不同线程存储自己的Looper对象
private ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();
private Looper(){
//维护一个消息队列
mQueue = new MessageQueue();
}
private static void prepare() {
if (sThreadLocal.get() != null) {//只能调用一次,如果调用第二次回清除之前的消息队列
throw new RuntimeException("Only one Looper may be created per thread");
}
sThreadLocal.set(new Looper());
}
public static Looper myLooper() {
return sThreadLocal.get();
}
//无限循环的从队列中获取消息
public static void loop(){
Looper me = myLooper();
MessageQueue queue = me.MQueue;
for(;;){
Message msg = queue.next();//没有消息了,这里会阻塞
if(msg == null){
return;//
}
//发送给对应的Handler处理
msg.target.dispatchMessage(msg);
}
}
}
public final class MessageQueue{
boolean enqueueMessage(Message msg, long when) {
//对消息的重新排序,通过判断消息队列里是否有消息以及消息的时间对比
}
}
public class 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();
}
}