999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Android多線程與消息循環(huán)

2013-01-26 03:20:38常州信息職業(yè)技術學院解志君
電子世界 2013年19期
關鍵詞:界面機制方法

常州信息職業(yè)技術學院 解志君

1.引言

Android的UI界面更新在多線程并發(fā)的環(huán)境下是不安全的,因此Android要求對UI界面的更新必須在UI線程(即主線程)中進行。如果在非UI線程中進行界面更新,系統(tǒng)會提示錯誤,這就是Android的單線程模型。但這是否意味著Android應用中只能有一個線程呢,答案是否定的。在Android中,除了UI線程外,還存在著工作線程,工作線程的作用是處理耗時的業(yè)務邏輯。這是因為耗時的業(yè)務邏輯不能放在UI線程中,因為那樣很可能阻塞UI線程,從而延遲程序?qū)τ脩舨僮鞯捻憫绻脩舻牟僮髟?0s內(nèi)得不到響應,系統(tǒng)會提示用戶ANR(Application Not Responsible)信息[1]。但是工作線程和UI線程又不是完全獨立的,有時候又要根據(jù)工作線程處理的結(jié)果來更新UI界面,但是更新UI界面不能在工作線程中進行,那么,工作線程又是如何通知UI線程來更新UI界面的呢?這就涉及到Android的消息循環(huán)機制。

2.Android的消息循環(huán)機制

Android的消息循環(huán)機制是事件處理的一種形式,它主要是為了解決Android線程間的通信問題。因此,深入理解Android系統(tǒng)的消息循環(huán)機制對于從更深層次上把握Android應用程序的運行機制是大有裨益的。其實Google在設計Android系統(tǒng)的消息循環(huán)時是參考了Windows程序的消息循環(huán)機制的,即Android應用程序的消息處理機制也是由消息循環(huán)、消息發(fā)送和消息處理三部分構(gòu)成的。消息循環(huán)是指發(fā)送給每個線程的消息都被按處理時間的先后順序存入該線程的消息隊列MessageQueue中,然后該線程的循環(huán)器Looper不斷的從該隊列中依次取出每條消息進行處理,若消息隊列為空,則該線程處于空閑等待狀態(tài);消息發(fā)送是指把消息發(fā)送到需要處理該消息的線程的消息隊列中,也就是需要與當前線程進行通信的線程的消息隊列中,Android中一般是通過Handler的相關方法來進行消息發(fā)送的;消息處理是指消息被從消息隊列中取出時,調(diào)用Handler的相關方法,一般是handleMessage()方法來對消息進行處理。理解Android的消息循環(huán)機制需要把握以下幾點:

(1)每個線程都有一個唯一的消息循環(huán)器Looper,它扮演著MessageQueue和Handler之間橋梁的角色,它源源不斷的依次從MessageQueue中取出消息,并將消息分發(fā)到指定的處理者Handler對象進行處理[2]。

(2)每個Looper都封裝了一個消息隊列MessageQueue,它是一個FIFO的隊列,用來存儲該Looper所關聯(lián)的線程的消息。

(3)每個Handler在創(chuàng)建時都被綁定到一個Looper,它是消息的發(fā)送者和處理者,它把消息發(fā)送到與它綁定的Looper的消息隊列中,同時,該消息的處理者就被設置為該Handler對象。當Looper從MessageQueue中循環(huán)到該條消息時,消息的處理者Handler對象的handleMessage()方法就會被自動調(diào)用,以處理該消息。

(4)Message是消息類,它封裝了消息的相關內(nèi)容,它的target屬性指明了該消息的處理者。下圖形象的說明了Handler的消息循環(huán)過程。

圖1 Android消息循環(huán)機制示意圖

3.Android UI線程與工作線程的消息循環(huán)

為了方便UI線程的消息事件處理,在Android應用程序的UI線程被創(chuàng)建時,系統(tǒng)會自動為UI線程創(chuàng)建一個消息循環(huán)器Looper,該類中封裝了一個MessageQueue的成員變量。也就是說,主線程在創(chuàng)建后就自動具有了消息循環(huán)器和消息隊列,開發(fā)人員只需將需要處理的消息發(fā)送至UI線程的消息隊列中。而在自定義的工作線程中,系統(tǒng)是不會自動為工作線程創(chuàng)建Looper和MessageQueue的,必須由程序員自己創(chuàng)建工作線程的Looper和MessageQueue。使用Android提供的API,可以非常容易做到這一點。

要為工作線程建立消息循環(huán),只需要四個步驟:

(1)生成工作線程的Looper,通過調(diào)用Looper.prepare()方法來實現(xiàn)。

(2)將Handler與工作線程的Looper的綁定,通過在工作線程中創(chuàng)建Handler對象來實現(xiàn),因為Handler在默認情況下是與創(chuàng)建它的線程的Looper綁定的,否則就需要在創(chuàng)建Handler時指定其構(gòu)造方法的Looper參數(shù)來顯式指定該Handler與哪個線程的Looper綁定。

(3)定義消息處理方法,通過重寫Handler的handleMessage()方法實現(xiàn)。

(4)啟動消息循環(huán),通過調(diào)用Looper.loop()方法實現(xiàn)。

(5)結(jié)束消息循環(huán),通過調(diào)用Looper.quit()方法實現(xiàn)。

另外需要說明的是,Android為了開發(fā)人員的方便,也提供了一個帶有消息循環(huán)的線程類HandlerThread,開發(fā)人員可以直接使用該類來創(chuàng)建工作線程,使用該類創(chuàng)建的線程會自動具有循環(huán)器Looper和消息隊列MessageQueue。

4.使用消息循環(huán)實現(xiàn)在工作線程中通知UI線程更新UI界面

下面的例子每隔1秒時間將界面上文本的顏色更改為一種隨機生成的顏色。這個功能使用Android消息循環(huán)是容易實現(xiàn)的。只需要在工作線程中每隔1秒向UI線程發(fā)送一條消息,UI線程處理這條,實現(xiàn)文本顏色的改變。下面來看一看實現(xiàn)這一功能的具體實現(xiàn)。

4.1 在工作線程中周期性的發(fā)送消息到UI線程的消息隊列

要在工作線程中周期性的向UI線程的消息隊列發(fā)送消息,需要在工作線程中使用一個循環(huán),可以通過一個標志變量來控制該循環(huán)的開始與停止;然后使用UI線程中創(chuàng)建的Handler對象的相關方法生成消息并發(fā)送至UI線程的消息隊列;接著讓工作線程休息1秒鐘。這樣工作線程就以周期為1秒的間隔不斷的向UI線程發(fā)送消息,直到工作線程停止。該工作線程的開啟可在Activity的onCreate()方法中來完成。下面是工作線程的實現(xiàn)代碼,代碼中的注釋對相關方法的功能進行了說明。

Thread t=new Thread(new Runnable(){//線程參數(shù)是一個匿名內(nèi)部類

@Override

public void run(){

while(!Thread.currentThread().isInterrupted()){//線程循環(huán)

Message msg=handler.obtain Message();//生成消息

msg.what=0x110;//設置消息標識,即Message的what屬性

handler.sendMessage(msg);//發(fā)送消息

try{

Thread.sleep(1000);//線程休眠1秒,實現(xiàn)周期性發(fā)送消息

}catch(InterruptedException e){

e.printStackTrace();

}

}

}

});

4.2 在UI線程中處理工作線程發(fā)送過來的消息

消息的處理是由Handler來完成的。要顯示消息的處理,需要在UI線程中創(chuàng)建Handler時重寫Handler的handlerMessage()方法,該方法定義了消息處理邏輯[3]。下面是在UI線程中創(chuàng)建Handler的代碼,代碼中注釋解釋了相關方法的功能。

//該Handler必須在UI線程中創(chuàng)建,以使之與UI線程關聯(lián)。否則需要使用帶Looper參數(shù)的

//造訪方法來創(chuàng)建Handler

Handler handler=new Handler(){//內(nèi)部類形式定義的Handler對象

@Override

public void handleMessage(Message msg){//重寫消息處理方法

if(msg.what==0x110){//通過消息表示區(qū)分消息

int red=new Random().nextInt(255);

int green=new Random().nextInt(255);

int blue=new Random().nextInt(255);

int color=Color.rgb(red,green,blue);//生成隨機顏色

txt.setTextColor(color);//設置文本顏色

}

}

};

5.結(jié)束語

Android的消息循環(huán)機制是Android事件處理的基石,所以從本質(zhì)上說,Android程序的運行機制是基于消息循環(huán)的,也就是說,Android程序是消息驅(qū)動的。在Android框架的實現(xiàn)源碼中,消息處理代碼隨處可見。當然,在我們實際的應用編程中,消息處理也應用得非常廣泛,比如工作線程通知主線程更新UI、游戲中周期性更新UI、線程間通信等。總之,Android的消息循環(huán)在Android框架中占有非常重要的地位,深入理解Android的消息循環(huán)機制,對于提升程序員的Android程序編制水平是非常有幫助的。

[1]李剛.瘋狂Android講義[M].北京:電子工業(yè)出版社,2013.

[2]高洪巖.Android學習精要[M].北京:清華大學出版社,2012.

[3]王國輝,李偉等.Android開發(fā)寶典[M].北京:機械工業(yè)出版社,2012.

猜你喜歡
界面機制方法
國企黨委前置研究的“四個界面”
當代陜西(2020年13期)2020-08-24 08:22:02
自制力是一種很好的篩選機制
文苑(2018年21期)2018-11-09 01:23:06
基于FANUC PICTURE的虛擬軸坐標顯示界面開發(fā)方法研究
人機交互界面發(fā)展趨勢研究
用對方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
破除舊機制要分步推進
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
手機界面中圖形符號的發(fā)展趨向
新聞傳播(2015年11期)2015-07-18 11:15:04
捕魚
注重機制的相互配合
主站蜘蛛池模板: 久久美女精品| 亚洲欧洲一区二区三区| 五月天香蕉视频国产亚| 亚洲国产成人久久77| AV无码一区二区三区四区| 真实国产乱子伦高清| 欧美在线中文字幕| 日韩在线观看网站| 久久婷婷人人澡人人爱91| 亚洲精品麻豆| 亚洲精品高清视频| 日韩黄色大片免费看| 欧美亚洲日韩中文| 亚洲天堂视频在线免费观看| 国产激情国语对白普通话| 91美女视频在线| a级毛片一区二区免费视频| 日韩欧美国产精品| 日韩高清在线观看不卡一区二区| a网站在线观看| 国产网站免费观看| 精品色综合| 国产男人的天堂| 毛片久久网站小视频| 欧美色图久久| 久久人搡人人玩人妻精品| 国产高清又黄又嫩的免费视频网站| 在线另类稀缺国产呦| 国产激情在线视频| 蜜桃视频一区| 国产日本欧美在线观看| 亚洲日韩精品无码专区97| 国产午夜福利在线小视频| 国产精品免费p区| 亚洲av无码片一区二区三区| 日韩AV无码免费一二三区| 亚洲人精品亚洲人成在线| 欧美成人午夜在线全部免费| 青青草国产精品久久久久| 色有码无码视频| 免费av一区二区三区在线| 中文字幕在线视频免费| 国产午夜一级淫片| 国产精品99一区不卡| 国产精品无码AV中文| 夜夜高潮夜夜爽国产伦精品| 亚洲黄色成人| 美女毛片在线| 四虎精品免费久久| 亚洲成a人在线观看| 午夜视频www| 永久免费无码日韩视频| 精品少妇人妻无码久久| 欧美一区国产| 真实国产乱子伦视频| 亚洲午夜综合网| 高清色本在线www| 国产精品2| 国产高清精品在线91| 国产第一页屁屁影院| 免费看黄片一区二区三区| 综合亚洲色图| 欧美日本在线一区二区三区| 国产欧美日韩va另类在线播放| yjizz视频最新网站在线| 国产精品自在自线免费观看| 高潮爽到爆的喷水女主播视频| 精品久久人人爽人人玩人人妻| 九九久久精品免费观看| 97人人做人人爽香蕉精品| 美女亚洲一区| 欧美一级99在线观看国产| 中文字幕色在线| 亚洲色婷婷一区二区| 国产手机在线小视频免费观看| 国产成人免费观看在线视频| 欧美黑人欧美精品刺激| 无码高潮喷水专区久久| 2020极品精品国产| 国产青榴视频| 亚洲浓毛av| 91精品福利自产拍在线观看|