Handler是一套Android的消息機(jī)制,用于線程中的通訊耐朴。
用最簡(jiǎn)單的話描述: handler其實(shí)就是主線程在起了一個(gè)子線程众弓,子線程運(yùn)行并生成Message,Looper在主線程中輪詢MessageQueue并傳遞給Handler隔箍,Handler逐個(gè)獲取子線程中的Message.
它主要通過4個(gè)組件來來完成
Looper
它是一種循環(huán)機(jī)制谓娃,負(fù)責(zé)在一個(gè)線程中不斷的輪詢MessageQueue,在UI線程外都需要手動(dòng)創(chuàng)建Looper
MessageQueue
它是一個(gè)消息列隊(duì)蜒滩,用于儲(chǔ)存和管理消息滨达,每一個(gè)Looper都有一個(gè)對(duì)應(yīng)的MessageQueue。
Handler
是一個(gè)用于發(fā)送和處理消息的工具俯艰,主要用于不同線程之間傳遞和處理消息捡遍,它可與目標(biāo)線程綁定,Handler收到消息后會(huì)放入與之綁定的Looper的MessageQueue中竹握。
Message
一個(gè)包含了數(shù)據(jù)和操作的對(duì)象画株,用于在不同的線程中傳遞消息。
注意事項(xiàng)
通常Handle是用匿名內(nèi)部類來實(shí)現(xiàn)啦辐,所以會(huì)隱式持有外部類引用谓传,常常會(huì)引發(fā)內(nèi)存泄漏,我們可以使用靜態(tài)內(nèi)部類和弱引用的方式避免這種情況的發(fā)生芹关。
當(dāng)MessageQueue中沒有消息時(shí)续挟,Looper會(huì)使線程處于wait的狀態(tài)
當(dāng)MessageQueue中有消息,但是未到達(dá)時(shí)侥衬,Looper處于等待狀態(tài)诗祸,當(dāng)被喚醒時(shí),則重新檢查MessageQueue轴总。