天天看點

Android消息循環分析

我們的經常使用的系統中,程式的工作一般是有事件驅動和消息驅動兩種方式,在Android系統中,Java應用程式是靠消息驅動來工作的。

消息驅動的原理就是:

1. 有一個消息隊列。能夠往這個隊列中投遞消息;

2. 有一個消息循環。不斷從消息隊列中取出消息。然後進行處理。

在Android中通過Looper來封裝消息循環。同一時候在當中封裝了一個消息隊列MessageQueue。

另外Android給我們提供了一個封裝類。來運作消息的投遞,消息的處理,即Handler。

<!--more-->

看上面的代碼。事實上就是先準備Looper,然後進入消息循環。

1. 在prepare的時候。建立一個Looper。同一時候在Looper的構造方法中建立一個消息隊列MessageQueue,同一時候将Looper儲存到TLV中<code>(這個是關于ThreadLocal的。不太懂。以後研究了再說)</code>

2. 調用loop進入消息循環。此處事實上就是不斷到MessageQueue中取消息<code>Message</code>。進行處理。

Handler的成員(非所有):

Message的成員(非所有):

能夠看到Handler的成員包括Looper,通過檢視源碼,我們能夠發現這個Looper是有兩種方式獲得的,1是在構造函數傳進來。2是使用目前線程的Looper(假設目前線程無Looper,則會報錯。我們在Activity中建立Handler不須要傳Handler是由于Activity本身已經有一個Looper了),MessageQueue也就是Looper中的消息隊列。

然後我們看怎麼向消息隊列發送消息。Handler有非常多方法發送隊列(這個自己能夠去查),比方我們看sendMessageDelayed(Message msg, long delayMillis)

看上面的的代碼。能夠看到Handler将自己設為Message的target。然後然後将msg放到隊列中,而且指定運作時間。

處理消息,即Looper從MessageQueue中取出隊列後,調用msg.target的dispatchMessage方法進行處理。此時會依照消息處理的優先級來處理:

1. 若msg本身有callback,則交其處理;

2. 若Handler有全局callback,則交由其處理;

3. 以上兩種都沒有,則交給Handler子類實作的handleMessage處理。此時須要重載handleMessage。

我們通常採用第三種方式進行處理。

!!我們通常是採用多線程,當建立Handler時,LooperThread中可能還未完畢Looper的建立,此時,Handler中無Looper,操作會報錯。

我們能夠採用Android為我們提供的HandlerThread來解決,該類已經建立了Looper,而且通過wait/notifyAll來避免錯誤的發生,降低我們反複造車的事情。我們建立該對象後。調用getLooper()就可以獲得Looper(Looper未建立時會等待)。

本文所屬為Android中java層的消息循環機制,其在Native層還有消息循環。有單獨的Looper。而且2.3以後MessageQueue的核心向Native層下移,native層java層均能夠使用。這個我沒有過多的研究了!哈哈

本文轉自mfrbuaa部落格園部落格,原文連結:http://www.cnblogs.com/mfrbuaa/p/5119113.html,如需轉載請自行聯系原作者

繼續閱讀