Android的訊息機制

2021-07-15 12:00:11 字數 3891 閱讀 3233

android的訊息機制主要是指handler的執行機制,而handler的執行離不開messagequeue和looper的支撐。

其中messagequeue稱為訊息佇列,用作儲存一組訊息,並以佇列的形式對外提供插入和刪除工作

(具體實現:使用單鏈表的結構來儲存訊息列表)。

messagequeue不能處理訊息

looper稱為迴圈,會以無限迴圈方式去查詢訊息和處理訊息。

如何獲取當前執行緒的looper(

建立handler物件時需要當前執行緒looper來構造訊息系統迴圈

)?通過threadlocal可獲取每個執行緒的looper(threadlocal在不同的執行緒中互不干擾的儲存和提供資料)。

一、android的訊息機制概述

1)handler主要作用:

將乙個任務切換到某個指定的執行緒中執行;

2)子執行緒不能訪問ui原因:

a)子執行緒訪問ui,會丟擲異常;

原因是viewrootimpl對ui操作左了驗證和限制---->ui只能由android主線程訪問。

b)ui控制項不是執行緒安全的;

不加鎖原因:防止ui邏輯複雜以及ui訪問效率低。

3)handler的工作過程:a)當send方法呼叫時,會呼叫messagequeue的enqueuemessage方法將訊息放入訊息佇列中;b)然後

looper發現有新的訊息就會處理這個訊息

,最終訊息中的runnable或者handlemessage方法被呼叫。

二、threadlocal的工作原理

threadlocal是乙個執行緒內部的資料儲存類,

通過它可以在指定的執行緒中儲存資料,資料儲存後,

只有在指定執行緒中可以獲取到儲存資料

,對於其他執行緒是無法獲取的。eg:

在主線程設定mbooleanthreadlocal為true;在子執行緒1設定其為false;在子執行緒2不設定,然後通過

同乙個mbooleanthreadlocal的get方法

獲取值,

然而3個執行緒中mbooleanthreadlocal的值不一樣。

原因:不同執行緒訪問同乙個threadlocal的get方法,

threadlocal內部會從各自執行緒的中取出乙個陣列

(每個執行緒內陣列不同)

,然後再從陣列中根據當前threadlocal的索引去查詢對應的value值。

2.1 threadlocal的set方法

1)首先先通過values方法獲取當前執行緒的theadlocal資料;如何獲取?在thread類的內部有一成員專門

用於儲存執行緒的threadlocal資料

:threadlocal.values 

localvalues;

2)在localvalues內部有一陣列:object tables,threadlocal的值就是存放在tables陣列中。也即通過

localvalues的put方法將value值儲存到陣列中:

2.2 threadlocal的get方法

1)第一步,同樣是取出當前執行緒的localvalues物件;如果物件為null,直接返回初始值;

2)如果物件不為null,從localvalues物件中取出table陣列,並從陣列中獲取value。

總結:

從上面set和get源**可以看出,它們的操作物件都是當前執行緒的localvalues物件的table陣列,導致在不同執行緒中訪問同乙個threadlocal物件的set和get方法,它們對threadlocal所做的讀/寫操作僅限於各自執行緒的內部。

三、訊息佇列的工作原理

android中訊息佇列是指messagequeue。messagequeue主要包含兩個操作:插入和讀取。

1)插入:

由enqueuemessage方法完成;

往訊息佇列中插入一條訊息;單鏈表的插入

2)讀取:

由next方法完成;

從訊息佇列中取出一條訊息並將其從訊息佇列中刪除。如果訊息佇列中沒有訊息,next方法會阻塞,當新訊息到來時,next方法會返回這條訊息並將其從單鏈表中刪除。

四、looper的工作原理

不停從messagequeue中檢視是否有新的資訊,如果有新的資訊就會立刻處理

,否則就一直阻塞。

4.1 looper的建構函式

1)建立乙個messagequeue訊息佇列;

2)將當前執行緒物件儲存下來;

4.2 為執行緒建立looper物件

1)通過looper.prepare()即可為當前執行緒建立乙個looper物件;

2)通過looper.loop()來開啟訊息迴圈;

3)getmainlooper()方法可以在任何地方獲取到主線程的looper。

五、handler的工作原理

handler的工作主要包含:

訊息的傳送和接收過程

。1)訊息的傳送是通過post方法以及

send一系列方法完成的。

5.1 訊息的傳送

源**如下:

1)handler傳送訊息的過程

:向訊息佇列中插入一條訊息,messagequeue的next方法就會返回訊息給looper; 2)

looper收到訊息就開始處理

,最終訊息由looper交給handler處理

,也即handler的dispatchmessage方法被呼叫。

5.2 訊息的處理

1)首先,

檢查message的callback是否為null,不為null就通過handlecallback來處理訊息

;message的callback是乙個runnable物件(post方法所傳遞的runnable引數)

2)其次

,檢查mcallback是否為null,不為null就呼叫mcallback的handlemessage方法來處理訊息。

其中callback是個介面

,其介面方法需要在子類實現。

3)最後,

呼叫handler的handlemessage方法來處理訊息

。其流程如下:

5.3 handler的建構函式

1)通過特定的looper來構造handler:

2)通過預設構造方法:

Android 的訊息機制

handler是android的訊息機制的上層介面,這使得在開發過程中只需要和handler互動即可,通過它可以很輕鬆地將乙個任務切換到handler所在的執行緒中去執行。android的訊息機制主要是指handler的執行機制,handler的執行需要底層的messageqeue和looper的支...

Android的訊息機制

android 有一種叫訊息佇列的說法,這裡我們可以這樣理解 假如乙個隧道就是乙個訊息佇列,那麼裡面的每一部汽車就是乙個乙個訊息,這裡我們先忽略掉超車等種種因素,只那麼先進隧道的車將會先出,這個機制跟我們android 的訊息機制是一樣的。一 角色描述 1.looper 相當於隧道 乙個執行緒可以產...

Android訊息機制

looper執行緒 主人 的 message queue 郵箱 唯一的管理人員 handler快遞小哥 跟管理人員looper溝通,送 push 新郵件 訊息 讓管理人員looper代簽扔進郵箱 message queue,也接收管理人員從郵箱拿出來的件。message queue 訊息佇列 主人的...