Android 的消息隊列模型

轉自:http://blog.csdn.net/ghj1976/archive/2011/05/06/6398896.aspx

Android是參考Windows的消息循環機制來實現Android自身的消息循環的。 
Android通過Looper、Handler來實現消息循環機制,Android消息循環是針對線程的(每個線程都可以有自己的消息隊列和消息循環)。 
Android系統中,Looper負責管理線程的消息隊列和消息循環。我們可以通過Loop.myLooper()得到當前線程的Looper對象,通過Loop.getMainLooper()可以獲得當前進程的主線程的Looper對象。 
一個線程可以存在(當然也可以不存在)一個消息隊列和一個消息循環(Looper)。 
Activity是一個UI線程,運行於主線程中,Android系統在啓動的時候會爲Activity創建一個消息隊列和消息循環(Looper)。 
Handler的作用是把消息加入特定的(Looper)消息隊列中,並分發和處理該消息隊列中的消息。構造Handler的時候可以指定一個Looper對象,如果不指定則利用當前線程的Looper創建。 
Activity、Looper、Handler,Thread的關係如下圖所示:

 

image

一個Activity中可以創建多個工作線程或者其他的組件,如果這些線程或者組件把他們的消息放入Activity的主線程消息隊列,那麼該消息就會在主線程中處理了。

因爲主線程一般負責界面的更新操作,並且Android系統中的widget不是線程安全的,所以這種方式可以很好的實現Android界面更新。在Android系統中這種方式有着廣泛的運用。

那麼一個線程怎樣把消息放入主線程的消息隊列呢?答案是通過Handle對象,只要Handler對象以主線程的Looper創建,那麼調用Handler的sendMessage等接口,將會把消息放入隊列都將是放入主線程的消息隊列。並且將會在Handler主線程中調用該handler的handleMessage接口來處理消息。

更多Android消息隊列的信息請參看: http://my.unix-center.net/~Simon_fu/?p=652

下面這個圖從另外一個角度描述了他們的關係:

image

參考資料:

Android異步加載圖像小結 
http://blog.csdn.net/sgl870927/archive/2011/03/29/6285535.aspx

深入理解Android消息處理系統——Looper、Handler、Thread

http://my.unix-center.net/~Simon_fu/?p=652

Android線程模型(Painless Threading) 
http://android.group.iteye.com/group/blog/382683

android線程控制UI更新(Handler 、post()、postDelayed()、postAtTime) 
http://lepeng.net/blogger/?p=21

Android – Multithreading in a UI environment 
http://www.aviyehuda.com/2010/12/android-multithreading-in-a-ui-environment/

Android中的Handler, Looper, MessageQueue和Thread 
http://www.cnblogs.com/xirihanlin/archive/2011/04/11/2012746.html

Android Runnable 
http://blog.csdn.net/michaelpp/archive/2010/06/30/5704682.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章