Handler是android子線程和主線程之間通信的一種機(jī)制。
主要包含四個(gè)類handler looper messagequeue message
handler作用?
用來發(fā)送和處理消息的瞒渠。
一個(gè)線程中多個(gè)handler發(fā)消息處理消息為什么不混亂技潘?:
message.target = handler(當(dāng)前發(fā)消息的handler)
Looper作用?:
通過loop(for死循環(huán))查看當(dāng)前的消息鏈表中是否有需要處理的message分飞。
MessageQueue作用悴务?:
用來存儲(chǔ)message的鏈表(鏈表中的消息message是按when(當(dāng)前系統(tǒng)的時(shí)間戳)從小到大的排列)。
Message作用譬猫?:
用來存儲(chǔ)消息內(nèi)容
如何把Handler,Looper,MessageQueue,Message串起來惨寿?
通過handler.sendMessage這個(gè)方法邦泄,把當(dāng)前的消息對(duì)象message傳入到handler中,通過handler中的messagequeue對(duì)象的引用裂垦,把Message放入到MessageQueue中顺囊。
在message存放的時(shí)候,message對(duì)象的target屬性記錄了當(dāng)前的handler蕉拢。message通過消息的執(zhí)行時(shí)間when特碳,從小到大排列插入到消息鏈表中。
我們looper的loop方法中的for(死循環(huán))去查看當(dāng)前的MessageQueue鏈表中是否有需要執(zhí)行的Message晕换。通過Message的when(消息的執(zhí)行時(shí)間判斷)和當(dāng)前的系統(tǒng)時(shí)間戳做對(duì)比午乓,如果當(dāng)前的系統(tǒng)時(shí)間戳小于當(dāng)前messagequeue鏈表中的消息執(zhí)行時(shí)間,當(dāng)前的執(zhí)行進(jìn)入等待狀態(tài)闸准。如果當(dāng)前的系統(tǒng)時(shí)間戳大于或等于當(dāng)前的MessageQueue鏈表中的消息執(zhí)行時(shí)間益愈,我們就把當(dāng)前的message從消息鏈表中刪除,并且把該消息返回給Looper的loop方法中夷家。
在loop方法中獲取到message以后判斷message所對(duì)應(yīng)的target是否存在蒸其,如果存在就調(diào)用target.dispathMessage方法把當(dāng)前的message傳入,在dispathMessage方法中库快,我們將調(diào)用handleMessage這個(gè)方法摸袁。把當(dāng)前取出的message傳出去。這樣在我們handler中重寫的handleMessage就拿到了當(dāng)前處理的消息义屏。