Handle的原理
andriod提供了Handler和Looper來滿足線程間的通信。Handler先進先出原則。Looper類用來管理特定線程內對象之間的消息交換(MessageExchange)。
MessageQueue
MessageQueue是持有Message(在Looper中派發)的壹個鏈表,Message並不是直接添加到MessageQueue中的,而是通過與Looper相關聯的Handler來進行的。
用來存放線程放入的消息,讀取會自動刪除消息,單鏈表維護,在插入和刪除上有優勢。在其next()中會無限循環,不斷判斷是否有消息,有就返回這條消息並移除。
Looper
壹個線程可以產生壹個Looper對象,由它來管理此線程裏的MessageQueue
Looper創建的時候會創建壹個MessageQueue,調用loop()方法的時候消息循環開始,loop()也是壹個死循環,會不斷調用messageQueue的next(),當有消息就處理,否則阻塞在messageQueue的next()中。當Looper的quit()被調用的時候會調用messageQueue的quit(),此時next()會返回null,然後loop()方法也跟著退出。
MessageQueue和Looper是壹對壹關系,Handler和Looper是多對壹
Handler
在主線程構造壹個Handler,與Looper溝通,以便push新消息到MessageQueue裏;
接收Looper從MessageQueue取出Handler所送來的消息。然後在其他線程調用sendMessage(),此時主線程的MessageQueue中會插入壹條message,然後被Looper使用.
Thread
UIthread 通常就是main thread,而Android啟動程序時會替它建立壹個MessageQueue,系統的主線程在ActivityThread的main()為入口開啟主線程,其中定義了壹系列消息類型,包含四大組件的啟動停止。
消息隊列分發算法源碼
每個message之間拉手,知道自己前面和後面的message
message通過時間戳來排序,小的在前
配合handle取出message,message時間到,就去除隊列首個message,取出之後置為null,第二個message就排在第壹,類推
//消息的存放
boolean enqueueMessage(Message msg, long when) {
synchronized (this) {
msg.when = when;
Message p = mMessages;? //註解1
if (p == null || when == 0 || when < p.when){
msg.next = p;
mMessages = msg; //註解2
} else {
Message prev;
for (;;) { ? //註解3
prev = p;
p = p.next;
if (p == null || when < p.when) {
break;
}
}
msg.next = p;
prev.next = msg;
}
}
return true;
}