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 訊息佇列 主人的...