每個android應用在被啓動時都會創建一個線程,這個線程成爲主線程或者UI線程。android應用的所有操作默認都會運行在這個線程中。但是爲了保證UI的流暢性,通常都會將耗時的操作放在子線程中。android3.0後,禁止在主線程中執行網絡請求,否則會拋出異常,可見UI線程中執行耗時操作是非常不推薦的行爲。
我們知道android應用啓動時,會默認有一個主線程,在這個線程中會關聯一個消息隊列,所有的操作都被封裝成消息然後交給主線程來處理。爲了保證主線程不會主動退出,會將獲取消息的操作放在一個死循環中,這樣程序就相當於一直在執行死循環。
每個Handler都會關聯一個消息隊列,消息隊列被封裝在looper中,每個looper又會關聯一個線程,looper通過ThreadLocal封裝,最終就等於每個消息隊列會關聯一個線程。Handler就是消息處理器,將消息投遞給消息隊列,然後再由對應的線程從消息隊列中取出消息執行。默認情況下,消息隊列只有一個,即主線程的消息隊列,這個消息隊列是在ActivityThread.main方法中創建的,通過Looper.prepareMainLooper來創建,最後執行Looper.loop來啓動消息循環。
消息隊列通過Looper與線程關聯上,而Handler又於looper關聯,因此Handler最終就和線程的消息隊列關聯上。就是因爲Handler要與主線程的消息隊列關聯上,這樣handleMessage纔會執行在UI線程,此時更新UI纔是線程安全的。
通過Looper.prepare來創建Looper對象,消息隊列封裝在looper對象中,並且保存在sThreadLocal中,然後通過Looper.loop來執行消息循環,這兩步通常是成對出現的。
子線程中創建Handler爲何拋出異常呢,因爲在子線程中創建Handler對象時,如果Looper對象爲空,那麼就會拋出Cannot create handler inside thread that has not called looper.prepare異常。
消息機制
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
定時器:消息機制
xushaozhang
2020-06-26 13:26:56
[iOS 理解] 消息機制
Eric217
2020-06-22 19:43:54
編程”靈魂之心“之消息機制
導讀 人之間有語言的交流還有一系列的信號傳達信息,那麼機器之間也有他們的語言,然而系統之間的工作也是靠互相通信才能完美的工作,那麼就讓我們看看
Jack__CJ
2020-06-22 04:32:18
Runtime(消息機制)筆記
抬头看见柠檬树
2020-06-21 05:43:34
Win32編程五:Windows消息機制
子建莫敌
2020-05-31 05:34:41
換個姿勢,帶着問題看Handler
coder-pig
2020-05-20 22:38:39
Android消息機制總結
且听风吟9527
2020-05-20 22:38:39
任性,通過線程檢查子線程照樣更新UI
且听风吟9527
2020-05-20 22:38:39
OnTime消息
titicacahang
2020-02-26 05:05:15
Android消息機制1-Handler(Java層)
楚湘潇瑶
2020-02-24 13:52:28
Windows消息機制的逆向分析(全面理解windows消息機制)
alzzw
2020-02-24 12:47:40
開發藝術探索 -- Android中的消息機制
Boo_Wang
2020-02-24 11:32:49
Android 的消息機制
small-dream
2020-02-24 03:01:35
android的消息處理機制(圖+源碼分析)——Thread,Looper,MessageQueue,Message,Handler之間的關係
ihrthk
2020-02-24 02:11:21
Android手掌抑制功能的實現
张明云
2020-02-24 01:09:15