Android 的訊息佇列模型
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的關係如所示:
一個Activity中可以建立多個背景工作執行緒或者其他的組件,如果這些線程或者組件把他們的訊息放入Activity的主線程訊息佇列,那麼該訊息就會在主線程中處理了。
因為主線程一般負責介面的更新操作,並且Android系統中的widget不是安全執行緒的,所以這種方式可以很好的實現Android介面更新。在Android系統中這種方式有著廣泛的運用。
那麼一個線程怎樣把訊息放入主線程的訊息佇列呢?答案是通過Handle對象,只要Handler對象以主線程的Looper建立,那麼調用Handler的sendMessage等介面,將會把訊息放入隊列都將是放入主線程的訊息佇列。並且將會在Handler主線程中調用該handler的handleMessage介面來處理訊息。
更多Android訊息佇列的資訊請參看: http://my.unix-center.net/~Simon_fu/?p=652
下面這個圖從另外一個角度描述了他們的關係:
參考資料:
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