本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/ghj1976/archive/2011/05/06/6398896.aspx
Android是參考Windows的消息循環(huán)機(jī)制來(lái)實(shí)現(xiàn)Android自身的消息循環(huán)的。
Android通過(guò)Looper、Handler來(lái)實(shí)現(xiàn)消息循環(huán)機(jī)制,Android消息循環(huán)是針對(duì)線程的(每個(gè)線程都可以有自己的消息隊(duì)列和消息循環(huán))。
Android系統(tǒng)中,Looper負(fù)責(zé)管理線程的消息隊(duì)列和消息循環(huán)。我們可以通過(guò)Loop.myLooper()得到當(dāng)前線程的Looper對(duì)象,通過(guò)Loop.getMainLooper()可以獲得當(dāng)前進(jìn)程的主線程的Looper對(duì)象。
一個(gè)線程可以存在(當(dāng)然也可以不存在)一個(gè)消息隊(duì)列和一個(gè)消息循環(huán)(Looper)。
Activity是一個(gè)UI線程,運(yùn)行于主線程中,Android系統(tǒng)在啟動(dòng)的時(shí)候會(huì)為Activity創(chuàng)建一個(gè)消息隊(duì)列和消息循環(huán)(Looper)。
Handler的作用是把消息加入特定的(Looper)消息隊(duì)列中,并分發(fā)和處理該消息隊(duì)列中的消息。構(gòu)造Handler的時(shí)候可以指定一個(gè)Looper對(duì)象,如果不指定則利用當(dāng)前線程的Looper創(chuàng)建。
Activity、Looper、Handler,Thread的關(guān)系如下圖所示:
一個(gè)Activity中可以創(chuàng)建多個(gè)工作線程或者其他的組件,如果這些線程或者組件把他們的消息放入Activity的主線程消息隊(duì)列,那么該消息就會(huì)在主線程中處理了。
因?yàn)橹骶€程一般負(fù)責(zé)界面的更新操作,并且Android系統(tǒng)中的widget不是線程安全的,所以這種方式可以很好的實(shí)現(xiàn)Android界面更新。在Android系統(tǒng)中這種方式有著廣泛的運(yùn)用。
那么一個(gè)線程怎樣把消息放入主線程的消息隊(duì)列呢?答案是通過(guò)Handle對(duì)象,只要Handler對(duì)象以主線程的Looper創(chuàng)建,那么調(diào)用Handler的sendMessage等接口,將會(huì)把消息放入隊(duì)列都將是放入主線程的消息隊(duì)列。并且將會(huì)在Handler主線程中調(diào)用該handler的handleMessage接口來(lái)處理消息。
更多Android消息隊(duì)列的信息請(qǐng)參看: http://my.unix-center.net/~Simon_fu/?p=652
下面這個(gè)圖從另外一個(gè)角度描述了他們的關(guān)系:
參考資料:
Android異步加載圖像小結(jié)
http://blog.csdn.net/sgl870927/archive/2011/03/29/6285535.aspx
深入理解Android消息處理系統(tǒng)——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