Handler伪代码帮助理解

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();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值