網站講Handler源碼解析的文章有很多,這里就不重復造輪子了,直接切重點。
其實子線程用Handler通過sendMessage發送消息,切換到主線程handleMessage進行處理,完成線程切換沒有什么神奇的。
首先自己也可以實現一個線程切換,聲明一個全局的類,在主線程對這個類進行實例化,子線程可以通過這個類的引用來執行這個類里面的方法,這就是線程切換。Handler也是如此不過容易被大家忽略。
public boolean sendMessageAtTime(Message msg, long uptimeMillis) { ........return enqueueMessage(queue, msg, uptimeMillis); }
Handler發送消息最終會走到enqueueMessage方法
private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) { msg.target = this; ........return queue.enqueueMessage(msg, uptimeMillis); }
msg.target = this,這句話讓target變量指向當前發送消息的Handler,即在主線程實例化的Handler。
public static void loop() { ........ for (;;) { ........ msg.target.dispatchMessage(msg); ........ } ........ }
在Looper.loop()里面,通過這個Handler引用調用到Handler的dispatchMessage(Message msg)
public void dispatchMessage(Message msg) { if (msg.callback != null) { handleCallback(msg);//Handler Post了一個runnable } else { if (mCallback != null) { //判斷是否實現了callback if (mCallback.handleMessage(msg)) { return; } } handleMessage(msg);//主線程方法 } }
dispatchMessage()最終走到了主線程的handleMessage方法。是不是很簡單。
