前言
雖然前不久看了Android消息機(jī)制方面的文章與部分代碼缨称,但是最近幾天還是有個(gè)問題沒解決:為什么一個(gè)Handler發(fā)送Message之后笛匙,Looper從MessageQueue中取出消息之后豺鼻,知道要分配給哪個(gè)Handler去處理呢痹扇?以為雖然一個(gè)線程里面只能有一個(gè)Looper對(duì)象斑鸦,但是卻能有多個(gè)Handler對(duì)象刻帚。
探尋
其實(shí)答案很簡(jiǎn)單勺择,在Handler發(fā)送Message的時(shí)候创南,在Message對(duì)象中將this賦值給了Message對(duì)象的一個(gè)變量target,下面是Handler將Message加入到消息隊(duì)列的源碼:
private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
msg.target = this;//這里賦值了
if (mAsynchronous) {
msg.setAsynchronous(true);
}
return queue.enqueueMessage(msg, uptimeMillis);
}
所以,Looper取出Message之后省核,直接調(diào)用msg.target.dispatch()即可分配到發(fā)送的Handler對(duì)象了扰藕。有點(diǎn)類似于回調(diào)的感覺。