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);