Handler 解析

Looper

Looper 内置一个MessageQueue,loop的时候,遍历MessageQueue里的Message,将Message交给自己的Target处理(Handler::dispatchMessage)

MessageQueue

//class:MessageQueue
enqueueMessage(Message msg,long when)
...
msg.when=when;
//按照msg.when排序插入队列
通过两个指针,取到合适位置,插入中间。队列按照从大到到小排列。如果队列中when都比当前的Message 的when大的话,就插入到队尾。
for(;;){
    prev=p;
    p=p.next();
    if(p==null||when>p.when){
        break;
    }
}
msg.next=p;
prev.next=msg;
Message next(){
    if(now < msg.when){
          
    }else{
        //取出现在可以执行的Message,从队列链条中取出。
    }
}

Handler

public static final Message obtainMessage(){
    return Message.obtain(this);
}
//分发
dispatchMessage(Message msg){
    if(msg.callback!=null){
        handleCallback(msg);
    }else{
        if(mCallback!=null){
            if(mCallback.handleMessage(msg)){
                return;
            }
        }
        handleMessage(msg);
    }
}

sendEmptyMessage(int what)
->sendEmptyMessageDelay(what,0)
sendEmptyMessageDelay(int what,long delayTime)
->Message msg=Message.obtain();
->msg.what=what
->sendMessageDelay(msg,dealyTime)
sendMessageDelay(Message msg,long delayMillis)
->sendMessageAtTime(msg,Systemclock.updateMillis()+delayMillis);

updateMillis

sendMessageAtTime(Message msg,long uptimeMillis)
->enqueueMessage(queue,msg,uptimeMillis);
enqueueMessage(MessageQueue queue,Message msg,long uptimeMillis)
->msg.target=this;
->queue.enqueueMessage(msg,uptimeMillis);

Handler的callBack

创建handler的时候,可以设置一个CallBack
如果设置了callback那么就优先执行Callback的 handleMessage
如果没有被处理,那么再调用handler的handleMessage

Message 的callback

创建消息的时候,可以自己设置一个callback,对于这个消息的处理,将执行handleCallback(msg)
->message.callback.run();

Message

//创建Message
public static Message obtain(Handler h,Runnable callback);

你可能感兴趣的:(Handler 解析)