您的位置:首页 > 编程语言

Handler伪代码帮助理解

2018-03-23 00:59 120 查看
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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: