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

Android多線程與消息循環

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

常州信息職業技術學院 解志君

1.引言

Android的UI界面更新在多線程并發的環境下是不安全的,因此Android要求對UI界面的更新必須在UI線程(即主線程)中進行。如果在非UI線程中進行界面更新,系統會提示錯誤,這就是Android的單線程模型。但這是否意味著Android應用中只能有一個線程呢,答案是否定的。在Android中,除了UI線程外,還存在著工作線程,工作線程的作用是處理耗時的業務邏輯。這是因為耗時的業務邏輯不能放在UI線程中,因為那樣很可能阻塞UI線程,從而延遲程序對用戶操作的響應,如果用戶的操作在20s內得不到響應,系統會提示用戶ANR(Application Not Responsible)信息[1]。但是工作線程和UI線程又不是完全獨立的,有時候又要根據工作線程處理的結果來更新UI界面,但是更新UI界面不能在工作線程中進行,那么,工作線程又是如何通知UI線程來更新UI界面的呢?這就涉及到Android的消息循環機制。

2.Android的消息循環機制

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

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

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

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

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

圖1 Android消息循環機制示意圖

3.Android UI線程與工作線程的消息循環

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

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

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

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

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

(4)啟動消息循環,通過調用Looper.loop()方法實現。

(5)結束消息循環,通過調用Looper.quit()方法實現。

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

4.使用消息循環實現在工作線程中通知UI線程更新UI界面

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

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

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

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

@Override

public void run(){

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

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

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

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

try{

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

}catch(InterruptedException e){

e.printStackTrace();

}

}

}

});

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

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

//該Handler必須在UI線程中創建,以使之與UI線程關聯。否則需要使用帶Looper參數的

//造訪方法來創建Handler

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

@Override

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

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

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.結束語

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

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

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

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

猜你喜歡
界面機制方法
國企黨委前置研究的“四個界面”
當代陜西(2020年13期)2020-08-24 08:22:02
自制力是一種很好的篩選機制
文苑(2018年21期)2018-11-09 01:23:06
基于FANUC PICTURE的虛擬軸坐標顯示界面開發方法研究
人機交互界面發展趨勢研究
用對方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
破除舊機制要分步推進
中國衛生(2015年9期)2015-11-10 03:11:12
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
手機界面中圖形符號的發展趨向
新聞傳播(2015年11期)2015-07-18 11:15:04
捕魚
注重機制的相互配合
中國衛生(2014年3期)2014-11-12 13:18:12
主站蜘蛛池模板: 国产成人精品免费av| 亚洲第一视频网站| 亚洲色无码专线精品观看| 青草精品视频| 欧美性天天| 亚洲IV视频免费在线光看| 亚洲av无码专区久久蜜芽| 国产中文一区二区苍井空| 日韩av无码精品专区| 色婷婷久久| 亚洲男人的天堂久久香蕉网| 国产亚洲精| 精品国产Av电影无码久久久| 久久青草热| 中国一级特黄大片在线观看| 亚洲精品男人天堂| 日韩精品免费在线视频| 伊人久久大香线蕉aⅴ色| 亚洲欧洲自拍拍偷午夜色| 国产在线精彩视频论坛| 亚洲性色永久网址| 国产精品久久精品| 日韩最新中文字幕| 欧美在线国产| 亚洲成av人无码综合在线观看| 无码电影在线观看| 操美女免费网站| 免费中文字幕在在线不卡| 久久一本精品久久久ー99| 国产美女精品在线| 日韩精品一区二区深田咏美| 国产大片喷水在线在线视频| 国产视频大全| 免费啪啪网址| 亚洲人成人伊人成综合网无码| 国内精品视频在线| 最新亚洲人成无码网站欣赏网 | 国产打屁股免费区网站| 漂亮人妻被中出中文字幕久久 | 国产精品视频导航| 99九九成人免费视频精品| 在线免费亚洲无码视频| 国产精品免费露脸视频| 国产在线精品网址你懂的| 99精品热视频这里只有精品7 | 久久网综合| 日本成人一区| 91九色国产在线| 国产成人资源| 国产杨幂丝袜av在线播放| 狠狠色狠狠综合久久| 精品国产一区二区三区在线观看| 欧美激情伊人| 色妞www精品视频一级下载| 午夜一区二区三区| 亚洲色欲色欲www网| 久久精品丝袜高跟鞋| 国产凹凸视频在线观看 | 九九热在线视频| www.99在线观看| 青青操国产视频| 久久综合结合久久狠狠狠97色| 日本欧美一二三区色视频| 狠狠做深爱婷婷久久一区| 国产真实乱子伦视频播放| 一级毛片在线免费视频| 亚洲美女一级毛片| 欧美激情第一区| 久久综合亚洲色一区二区三区| 免费无码又爽又黄又刺激网站| 亚欧乱色视频网站大全| 国产乱子伦视频三区| 亚洲高清日韩heyzo| 精品国产免费观看一区| 国产免费久久精品99re不卡| 亚洲成人www| 亚洲国产综合精品中文第一| 久久国产精品电影| 国产精品亚洲五月天高清| 国产成人盗摄精品| 亚洲AV永久无码精品古装片| 欧美中文字幕一区|