Android訊息佇列原理

2021-07-10 22:27:28 字數 1764 閱讀 5631

message類的obtain方法

if (spool != null)

建立handler物件時,在構造方法中會獲取looper和messagequeue的物件

public handler()

檢視mylooper方法體,發現looper物件是通過threadlocal得到的,在查詢threadlocal的set方法時發現

sthreadlocal.set(new looper());

private

looper()

public static final void preparemainlooper()

在應用啟動時,主線程要被啟動,activitythread會被建立,在此類的main方法中

public static final void main(string args)

looper.loop()方法中有乙個死迴圈

while (true)

linux的乙個程序間通訊機制:管道(pipe)。原理:在記憶體中有乙個特殊的檔案,這個檔案有兩個控制代碼(引用),乙個是讀取控制代碼,乙個是寫入控制代碼

主線程looper從訊息佇列讀取訊息,當讀完所有訊息時,進入睡眠,主線程阻塞。子執行緒往訊息佇列傳送訊息,並且往管道檔案寫資料,主線程即被喚醒,從管道檔案讀取資料,主線程被喚醒只是為了讀取訊息,當訊息讀取完畢,再次睡眠

handler傳送訊息,sendmessage的所有過載,實際最終都呼叫sendmessageattime

public boolean sendmessageattime(message msg, long uptimemillis)

enqueuemessage把訊息通過重新排序放入訊息佇列

final boolean enqueuemessage(message msg, long when)  else 

msg.next = prev.next;

prev.next = msg;

needwake = false; // still waiting on head, no need to wake up}}

//喚醒主線程

if (needwake)

return true;

}

looper.loop方法中,獲取訊息,然後分發訊息

//獲取訊息佇列的訊息

message msg = queue.next(); // might block

...//分發訊息,訊息由哪個handler物件建立,則由它分發,並由它的handlermessage處理

msg.target.dispatchmessage(msg);

message物件的target屬性,用於記錄該訊息由哪個handler建立,在obtain方法中賦值

訊息佇列的原理

簡介 訊息驅動機制是 gui 系統的基礎,訊息驅動的底層基礎設施之一是訊息佇列,它是整個 gui 系統運轉中樞,本文介紹了乙個基於環形佇列的訊息佇列實現方法,給出了它的資料結構 主要操作流程和核心 環形佇列 環行佇列是一種首尾相連的佇列資料結構,遵循先進先出原則,如下圖所示 ring buffer ...

Android訊息推送原理

出處 產品的角度 功能需要,比如說資訊類產品的新聞推送 工具類產品的公告推送等等 運營的角度 活動運營需要,比如說電商類產品的 活動 召回使用者 提高活躍度等等 作為開發者,不要有需求就接,應該多思考 多理解使用者 功能的使用場景,有助於我們更好地去選擇合適的開發方式 作業系統有自身的訊息推送功能 ...

android訊息佇列機制(Handler)

大家應該都知道,在android中子執行緒是無法進行ui操作的,如果想要使得主線程能夠操作ui元素,我們應該怎麼做呢?針對於這個我簡單的講解一下android中訊息佇列機制。訊息佇列機制 如上圖所示 主線程建立時,系統會同時建立訊息佇列物件 messagequeue 和訊息輪詢器物件 looper ...