轉(zhuǎn)帖|其它|編輯:郝浩|2011-08-15 17:42:17.000|閱讀 455 次
概述:Android應(yīng)用程序也是消息驅(qū)動的,按道理來說也應(yīng)該提供消息循環(huán)機制。實際上谷歌參考了Windows的消息循環(huán)機制,也在Android系統(tǒng)中實現(xiàn)了消息循環(huán)機制。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
Android應(yīng)用程序也是消息驅(qū)動的,按道理來說也應(yīng)該提供消息循環(huán)機制。實際上谷歌參考了Windows的消息循環(huán)機制,也在Android系統(tǒng)中實現(xiàn)了消息循環(huán)機制。
Android通過Looper、Handler來實現(xiàn)消息循環(huán)機制,Android消息循環(huán)是針對線程的(每個線程都可以有自己的消息隊列和消息循環(huán))。
本文深入介紹一下Android消息處理系統(tǒng)原理。
Android系統(tǒng)中Looper負(fù)責(zé)管理線程的消息隊列和消息循環(huán),具體實現(xiàn)請參考Looper的源碼。 可以通過Loop.myLooper()得到當(dāng)前線程的Looper對象,通過Loop.getMainLooper()可以獲得當(dāng)前進(jìn)程的主線程的Looper對象。
前面提到Android系統(tǒng)的消息隊列和消息循環(huán)都是針對具體線程的,一個線程可以存在(當(dāng)然也可以不存在)一個消息隊列 和一個消息循環(huán)(Looper),特定線程的消息只能分發(fā)給本線程,不能進(jìn)行跨線程,跨進(jìn)程通訊。但是創(chuàng)建的工作線程默認(rèn)是沒有消息循環(huán)和消息隊列的,如果想讓該線程具有消息隊列和消息循環(huán),需要在線程中首先調(diào)用Looper.prepare()來創(chuàng)建消息隊列,然后調(diào)用Looper.loop()進(jìn)入消息循環(huán)。如下例所示:
這樣你的線程就具有了消息處理機制了,在Handler中進(jìn)行消息處理。
Activity是一個UI線程,運行于主線程中,Android系統(tǒng)在啟動的時候會為Activity創(chuàng)建一個消息隊列和消息循環(huán)(Looper)。詳細(xì)實現(xiàn)請參考ActivityThread.java文件。
Handler的作用是把消息加入特定的(Looper)消息隊列中,并分發(fā)和處理該消息隊列中的消息。構(gòu)造Handler的時候可以指定一個Looper對象,如果不指定則利用當(dāng)前線程的Looper創(chuàng)建。詳細(xì)實現(xiàn)請參考Looper的源碼。
Activity、Looper、Handler的關(guān)系如下圖所示:
一個Activity中可以創(chuàng)建多個工作線程或者其他的組件,如果這些線程或者組件把他們的消息放入Activity的主線程消息隊列,那么該消息就會在 主線程中處理了。因為主線程一般負(fù)責(zé)界面的更新操作,并且Android系統(tǒng)中的weget不是線程安全的,所以這種方式可以很好的實現(xiàn)Android界 面更新。在Android系統(tǒng)中這種方式有著廣泛的運用。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:博客園