Handler解析
1973 ワード
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);