消息隊列的工作原理
消息隊列在Android中指的是MessageQueue,Messageueue主要包含兩個操作:插入和讀取。讀取操作本身會伴隨著刪除操作,插入與讀取對應(yīng)的方法為:enqueueMessage和next。其中,enqueueMessage的作用是往消息隊列中插入一條消息,而next的作用是從消息隊列中取出一條消息并將其從消息隊列中移除。盡管MessageQueue叫消息隊列,但是它的內(nèi)部實現(xiàn)并不是用的隊列而是一個單鏈表的數(shù)據(jù)結(jié)構(gòu)來維護消息列表。
其中enqueueMessage源碼:
從enqueueMessage的實現(xiàn)來看,主要操作其實就是單鏈表的插入操作
next源碼:略(太多了,不截圖了)
next是一個無限循環(huán)的方法,如果消息隊列中沒有消息,那么next方法就會一直阻塞在這里。
Lopper的工作原理
Looper在Android的消息機制中扮演著消息循序的角色,具體來說就是它會不停地從MessageQueue中查看是否有新消息,如果有新消息就會立刻處理,否則就一直堵塞在那里。在它的構(gòu)造方法中,會創(chuàng)建一個MessageQueue即消息隊列:
通過Looper.prepare()即可為當前線程創(chuàng)建一個Looper,接著通過Looper.loop()來開啟消息循序:
同時,Looper提供prepareMainLooper方法,此方法是給主線程也就是ActivityThread創(chuàng)建Looper使用的。
由于主線程的Looper比較特殊,所以Looper也提供了getMainLooper()方法,通過它也可以在任何地方獲取到主線程的Looper。
Looper也可以直接退出的:
quit():直接退出Looper
quitSafely():只是設(shè)定了一個退出標記,然后把消息隊列中的已有消息處理完畢后才安全退出。