1事件處理簡介_第1頁
1事件處理簡介_第2頁
1事件處理簡介_第3頁
1事件處理簡介_第4頁
1事件處理簡介_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

事件處理簡介一、基于監(jiān)聽器的事件處理2相比于基于回調(diào)的事件處理,這是更具“面向?qū)ο蟆毙再|(zhì)的事件處理方式。在監(jiān)聽器模型中,主要涉及三類對象:1)事件源EventSource:產(chǎn)生事件的來源,通常是各種組件,如按鈕,窗口等。2)事件Event:事件封裝了界面組件上發(fā)生的特定事件的具體信息,如果監(jiān)聽器需要獲取界面組件上所發(fā)生事件的相關(guān)信息,一般通過事件Event對象來傳遞。3)事件監(jiān)聽器EventListener:負(fù)責(zé)監(jiān)聽事件源發(fā)生的事件,并對不同的事件做相應(yīng)的處理?;诒O(jiān)聽器的事件處理機(jī)制是一種委派式Delegation的事件處理方式,事件源將整個事件委托給事件監(jiān)聽器,由監(jiān)聽器對事件進(jìn)行響應(yīng)處理。這種處理方式將事件源和事件監(jiān)聽器分離,有利于提供程序的可維護(hù)性。一、基于監(jiān)聽器的事件處理3View類中的OnLongClickListener監(jiān)聽器定義如下:(不需要傳遞事件)public

interface

OnLongClickListener{

boolean

onLongClick(Viewv);

}

public

interface

OnLongClickListener{

boolean

onLongClick(Viewv);}一、基于監(jiān)聽器的事件處理4View類中的OnLongClickListener監(jiān)聽器定義如下:(需要傳遞事件MotionEvent)public

interface

OnTouchListener{

boolean

onTouch(Viewv,MotionEventevent);

}

public

interface

OnTouchListener{

boolean

onTouch(Viewv,MotionEventevent);}二、基于回調(diào)的事件處理5相比基于監(jiān)聽器的事件處理模型,基于回調(diào)的事件處理模型要簡單些,該模型中,事件源和事件監(jiān)聽器是合一的,也就是說沒有獨立的事件監(jiān)聽器存在。當(dāng)用戶在GUI組件上觸發(fā)某事件時,由該組件自身特定的函數(shù)負(fù)責(zé)處理該事件。通常通過重寫Override組件類的事件處理函數(shù)實現(xiàn)事件的處理。二、基于回調(diào)的事件處理6View類實現(xiàn)了KeyEvent.Callback接口中的一系列回調(diào)函數(shù),因此,基于回調(diào)的事件處理機(jī)制通過自定義View來實現(xiàn),自定義View時重寫這些事件處理方法即可。public

interface

Callback{

//幾乎所有基于回調(diào)的事件處理函數(shù)都會返回一個boolean類型值,該返回值用于

//標(biāo)識該處理函數(shù)是否能完全處理該事件//返回true,表明該函數(shù)已完全處理該事件,該事件不會傳播出去//返回false,表明該函數(shù)未完全處理該事件,該事件會傳播出去

boolean

onKeyDown(int

keyCode,KeyEventevent);

boolean

onKeyLongPress(int

keyCode,KeyEventevent);

boolean

onKeyUp(int

keyCode,KeyEventevent);

boolean

onKeyMultiple(int

keyCode,int

count,KeyEventevent);public

interface

Callback{

//幾乎所有基于回調(diào)的事件處理函數(shù)都會返回一個boolean類型值,該返回值用于

//標(biāo)識該處理函數(shù)是否能完全處理該事件//返回true,表明該函數(shù)已完全處理該事件,該事件不會傳播出去//返回false,表明該函數(shù)未完全處理該事件,該事件會傳播出去

boolean

onKeyDown(int

keyCode,KeyEventevent);

boolean

onKeyLongPress(int

keyCode,KeyEventevent);

boolean

onKeyUp(int

keyCode,KeyEventevent);

boolean

onKeyMultiple(int

keyCode,int

count,KeyEventevent);}三、事件處理的比對7基于監(jiān)聽器的事件模型符合單一職責(zé)原則,事件源和事件監(jiān)聽器分開實現(xiàn);Android的事件處理機(jī)制保證基于監(jiān)聽器的事件處理會優(yōu)先于基于回調(diào)的事件處理被觸發(fā);某些特定情況下,基于回調(diào)的事件處理機(jī)制會更好的提高程序的內(nèi)聚性。四、自定義監(jiān)聽器事件處理8在實際項目開發(fā)中,我們經(jīng)常需要自定義監(jiān)聽器來實現(xiàn)自定義業(yè)務(wù)流程的處理,而且一般都不是基于GUI界面作為事件源的。這里以常見的app自動更新為例進(jìn)行說明,在自動更新過程中,會存在兩個狀態(tài):下載中和下載完成,而我們的程序需要在這兩個狀態(tài)做不同的事情,“下載中”需要在UI界面上實時顯示軟件包下載的進(jìn)度,“下載完成”后,取消進(jìn)度條的顯示。這里進(jìn)行一個模擬,重點在說明自定義監(jiān)聽器的事件處理流程。四、自定義監(jiān)聽器事件處理9定義事件監(jiān)聽器如下public

interface

DownloadListener{

public

void

onDownloading(int

porgress);//下載過程中的處理函數(shù)

public

void

onDownload();//下載完成的處理函數(shù)}四、自定義監(jiān)聽器事件處理10實現(xiàn)下載操作的工具類代碼:public

class

DownloadUtils{

private

static

DownloadUtilsinstance=null;

private

private(){

}

public

static

synchronized

DownloadUtilsinstance(){

if(instance==null){

instance=new

DownloadUtils();

}

returnsinstance;

}}private

boolean

isDownloading=ture;private

int

progress=0;//實際開發(fā)中這個函數(shù)需要傳人url作為參數(shù),以獲取服務(wù)器端安裝包位置

public

void

download(DownloadListenerlistener)throws

interruptdeException{while

(isDownloading){

listener.onDownloading(progress);

//下載過程的簡單模擬

Thread.sleep(1000);

progress+=10;

if(progress>=100){

isDownloading=false;

}}//下載完成listener.onDownload();}}四、自定義監(jiān)聽器事件處理11最后在main函數(shù)中模擬事件源:public

class

DownloadUI{

public

static

void

main(sting[]args){

try{

DownloadUtils.instance().download(new

MyDownloadListener());

}catch(InterruptedExceptiobe){

e.printStackTrace();

}

}

private

static

class

MyDownloadListenerimplements

DownloadListener{

@Overridepublic

void

onDownloa

溫馨提示

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

最新文檔

評論

0/150

提交評論