標籤:emc 迴圈 called further als 訊息機制 contain lock lis
Handler是訊息機制的面板類,我們通過Handler.send或者post訊息然後在handleMessage()中去處理訊息.發送訊息
public final boolean sendMessage(Message msg) { return sendMessageDelayed(msg, 0); } public final boolean sendMessageDelayed(Message msg, long delayMillis) { if (delayMillis < 0) { delayMillis = 0; } return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis); } public boolean sendMessageAtTime(Message msg, long uptimeMillis) { MessageQueue queue = mQueue; if (queue == null) { RuntimeException e = new RuntimeException( this + " sendMessageAtTime() called with no mQueue"); Log.w("Looper", e.getMessage(), e); return false; } return enqueueMessage(queue, msg, uptimeMillis); } private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) { msg.target = this; if (mAsynchronous) { msg.setAsynchronous(true); } return queue.enqueueMessage(msg, uptimeMillis); }sendMessage操作都只是對Message做了一個入隊的操作.Looper無限迴圈從MessageQueue中取出Message然後調用Handler的dispatchMessage來處理訊息處理訊息
public void dispatchMessage(Message msg) { if (msg.callback != null) { handleCallback(msg); } else { if (mCallback != null) { if (mCallback.handleMessage(msg)) { return; } } handleMessage(msg); } }msg的callback是一個Runnable,handlecallback(msg)就是調用了Runnable的run方法.callable介面第五行的mCallback是一個介面,定義如下
/** * Callback interface you can use when instantiating a Handler to avoid * having to implement your own subclass of Handler. */ public interface Callback { /** * @param msg A {@link android.os.Message Message} object * @return True if no further handling is desired */ public boolean handleMessage(Message msg); }可以通過Handler handler = new Handler(new CallBack(){})來使用,作用就是避免建立Handler的子類.
Handler工作原理