Android消息機制的原理剖析—閉環總結前面分篇介紹了Handler、MessageQueue、Looper、Message、消息池等消息機制的基本單元,源碼細節太多,本著“深入淺出”的原則,概述消息機制基本流程,將消息機制的原理閉環。我將消息機制概括7個步驟:創建,發送、排隊、取出、派送、處理、回收,下面是流程圖。
(1)創建:Message.obtain()從消息池中獲取一個空的Message,如果池子為空,則返回一個new Message(),然后組裝要攜帶的信息。
(2) 發送:無論是Message的sendToTarget()還是Handler的post()和send()系列方法,終調用的是MessageQueue的enqueueMessage(),目的是插入消息到隊列中。
(3)排隊:插入的消息按照時間順序排隊,排在隊首的是先處理的消息,排在隊尾的是后要處理的。
(4)獲取:Loop循環每一次循環只要檢查隊首的消息,沒有符合條件的Message則線程阻塞,有符合則從MessageQueue取出。
(5)派送: 發送和派送是同一個Handler(每個消息攜帶著發送的Hanlder引用)。
(6)處理:如果消息攜帶Runnable則調用其run()方法處理,如果Handler有CallBack則調用CallBack的handleMessage()處理;如果兩個都沒有,則使用Handler的handleMessage()來處理。
(7)回收:處理完畢的消息是要回收方便再次使用,在Looper的loop()中調用recycleUnCheck()——>recycle()將消息的內容清空回收,如果消息池沒滿,則放入消息池,如果消息池滿了(系統6.0 int spoolSize=50),則丟掉這個消息。消息池是進程中所有線程共享的。
這個是如何互相聯系的尼:
(a)MessageQueue和Looper:一對一關系,MessageQueue的創建后放置在Looper中。
(b)Looper和線程:一個線程只有一個,創建之后保存在ThreadLocal中,想要獲取ThreadLocal.get()即可。
(c)Handler和Looper:Handler創建時候,從ThreadLocal中獲取Looper,Handler變量指向這個Looper,Handler和Looper綁定。
(d)Message和Handler:Handler發送Message時候,Message的target屬性指向這個Handler,也是這個Handler來分發處理這個Message
(e)消息池:only one,所有線程共享。
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。