當前位置:商標查詢大全網 - 遊戲電競 - Android消息機制和原理

Android消息機制和原理

Android消息機制及其原理

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;

}