【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中如何應(yīng)用Message機(jī)制_第1頁(yè)
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中如何應(yīng)用Message機(jī)制_第2頁(yè)
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中如何應(yīng)用Message機(jī)制_第3頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余1頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中如何應(yīng)用Message機(jī)制

本篇文章給大家分享的是有關(guān)Android中如何應(yīng)用Message機(jī)制,在下覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著在下一起來(lái)看看吧。一、線程間通訊的Message機(jī)制1、Message介紹frameworks\base\core\java\android\Os\Message.javaMessage是線程之間傳遞信息的載體,包含了對(duì)消息的描述和任意的數(shù)據(jù)對(duì)象。Message中包含了兩個(gè)額外的

int字段和一個(gè)object字段,這樣在大部分情況下,使用者就不需要再做內(nèi)存分配工作了。雖然Message的構(gòu)造函數(shù)是public的,但是***是使用Message.obtain()或Handler.obtainMessage(

)函數(shù)來(lái)獲取Message對(duì)象,因?yàn)镸essage的實(shí)現(xiàn)中包含了回收再利用的機(jī)制,可以提供效率。2、MessageQueue介紹frameworks\base\core\java\android\Os\MessageQueue.javaMessageQueue用來(lái)容納Message隊(duì)列的,其中的Message是由Looper來(lái)分發(fā)的,Message不能直接添加到MessageQueue中,而是要通過(guò)與Looper關(guān)聯(lián)的Handler去添加。3、Looperframeworks\base\core\java\android\Os\Looper.javaLooper是線程用來(lái)運(yùn)行消息循環(huán)的。線程本身是沒(méi)有消息循環(huán)的,需要在線程中調(diào)用perpare函數(shù),然后調(diào)用loop去處理消息。在Android中,系統(tǒng)在啟動(dòng)主線程的時(shí)候會(huì)自動(dòng)為之建立一個(gè)Looper。建立本線程的Looper:publicstaticfinalvoidprepare()運(yùn)行本線程的Looper:publicstaticfinalvoidloop()獲取本線程的Looper:publicstaticfinalLoopermyLooper()獲取主線程的Looper:publicsynchronizedstaticfinalLoopergetMainLooper()4、Handlerframeworks\base\core\java\android\Os\Handler.javaHandler是用來(lái)發(fā)送和處理與線程相關(guān)聯(lián)的Message和Runnable對(duì)象的。每個(gè)Handler都與一個(gè)單獨(dú)的線程以及線程消息隊(duì)列相關(guān)聯(lián)的。當(dāng)你創(chuàng)建Handler時(shí),Handler就與線程以及線程消息隊(duì)列綁定了,從那以后,Handler就可以將

Message和Runnable發(fā)送給對(duì)應(yīng)的消息隊(duì)列,并且能夠處理從消息隊(duì)列中出來(lái)的消息。Handler提供了用戶需要調(diào)用的大部分接口A、創(chuàng)建Handler:創(chuàng)建與本地線程相關(guān)聯(lián)的Handler:public

Handler()public

Handler(Callbackcallback)創(chuàng)建與指定線程相關(guān)聯(lián)的Handler:public

Handler(Looperlooper)public

Handler(Looperlooper,Callbackcallback)B、創(chuàng)建消息public

final

Message

obtainMessage()

public

final

Message

obtainMessage(int

what)

public

final

Message

obtainMessage(int

what,

Object

obj)

public

final

Message

obtainMessage(int

what,

int

arg1,

int

arg2)

public

final

Message

obtainMessage(int

what,

int

arg1,

int

arg2,

Object

obj)C、刪除消息

刪除在消息隊(duì)列中未處理的消息public

final

void

removeMessages(int

what)

public

final

void

removeMessages(int

what,

Object

object)D、發(fā)送消息public

final

boolean

sendMessage(Message

msg)

public

final

boolean

sendMessageDelayed(Message

msg,

long

delayMillis)

public

final

boolean

post(Runnable

r)

public

final

boolean

postDelayed(Runnable

r,

long

delayMillis)E、處理消息在Looper的loop函數(shù)中循環(huán)取出MessageQueue的接收消息隊(duì)列中的消息,然后調(diào)用Hander的dispatchMessage函數(shù)對(duì)消息進(jìn)行處理,至于如何處理(相應(yīng)消息)則由用戶指定(三個(gè)方法,優(yōu)先級(jí)從高到低:Message里面的Callback,一個(gè)實(shí)現(xiàn)了Runnable接口的對(duì)象,其中run函數(shù)做處理工作;Handler里面的mCallback指向的一個(gè)實(shí)現(xiàn)了Callback接口的對(duì)象,里面的handleMessage進(jìn)行處理;處理消息

Handler對(duì)象對(duì)應(yīng)的類繼承并實(shí)現(xiàn)了其中handleMessage函數(shù),通過(guò)這個(gè)實(shí)現(xiàn)的handleMessage函數(shù)處理消息)。public

void

dispatchMessage(Message

msg)

{

if

(msg.callback

!=

null)

{

handleCallback(msg);

}

else

{

if

(mCallback

!=

null)

{

if

(mCallback.handleMessage(msg))

{

return;

}

}

handleMessage(msg);

}

}二、Message機(jī)制的用途Message機(jī)制有兩種用途:定時(shí)執(zhí)行:延遲到指定時(shí)間執(zhí)行消息調(diào)度線程通訊:將某些操作在其他線程中排隊(duì)執(zhí)行1、定時(shí)執(zhí)行通過(guò)本線程的Handler將消息延遲到指定時(shí)間執(zhí)行,相當(dāng)于定時(shí)器的作用public

final

boolean

sendMessageDelayed(Message

msg,

long

delayMillis)

public

final

boolean

postDelayed(Runnable

r,

long

delayMillis)還可以在指定時(shí)間到期之前,通過(guò)removeMessages取消執(zhí)行2、線程通訊Android的UI是單線程的,Android希望UI線程能夠給予User快速的反應(yīng),如果UI線程花費(fèi)太多的時(shí)間做幕后的事情,吵過(guò)5秒鐘,Android就會(huì)給出錯(cuò)誤提示。因此為了避免拖住UI,一下較費(fèi)時(shí)的工作應(yīng)該交給獨(dú)立的線程去執(zhí)行。但是如果幕后的線程來(lái)執(zhí)行UI對(duì)象,Android又會(huì)發(fā)出錯(cuò)誤信息,所以UI線程與幕后線程需要進(jìn)行通訊。UI線程將工作分發(fā)給幕后線程,幕后線程執(zhí)行后將相應(yīng)的狀態(tài)返回給UI線程,讓UI線程對(duì)UI做成相應(yīng)的更新??偨Y(jié):所謂的消息機(jī)制其實(shí)很簡(jiǎn)單,實(shí)現(xiàn)這種機(jī)制需要只需要四步:1、實(shí)例化Looper(因?yàn)閷?shí)例化Handler時(shí)需要一個(gè)looper);2、實(shí)例化Handler,這里需要覆蓋handleMessage方法,處理收到的消息;3、

實(shí)例化Message對(duì)象,調(diào)用已經(jīng)實(shí)例化好的handler對(duì)象的obtainM

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論