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);
网友评论