国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

詳解Android的兩種事件處理機(jī)制

2019-12-12 04:48:30
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

UI編程通常都會(huì)伴隨事件處理,Android也不例外,它提供了兩種方式的事件處理:基于回調(diào)的事件處理和基于監(jiān)聽(tīng)器的事件處理。

對(duì)于基于監(jiān)聽(tīng)器的事件處理而言,主要就是為Android界面組件綁定特定的事件監(jiān)聽(tīng)器;對(duì)于基于回調(diào)的事件處理而言,主要做法是重寫(xiě)Android組件特定的回調(diào)函數(shù),Android大部分界面組件都提供了事件響應(yīng)的回調(diào)函數(shù),我們主要重寫(xiě)它們就行。

一 基于監(jiān)聽(tīng)器的事件處理

相比于基于回調(diào)的事件處理,這是更具“面向?qū)ο蟆毙再|(zhì)的事件處理方式。在監(jiān)聽(tīng)器模型中,主要涉及三類對(duì)象:

1)事件源Event Source:產(chǎn)生事件的來(lái)源,通常是各種組件,如按鈕,窗口等。

2)事件Event:事件封裝了界面組件上發(fā)生的特定事件的具體信息,如果監(jiān)聽(tīng)器需要獲取界面組件上所發(fā)生事件的相關(guān)信息,一般通過(guò)事件Event對(duì)象來(lái)傳遞。

3)事件監(jiān)聽(tīng)器Event Listener:負(fù)責(zé)監(jiān)聽(tīng)事件源發(fā)生的事件,并對(duì)不同的事件做相應(yīng)的處理。

基于監(jiān)聽(tīng)器的事件處理機(jī)制是一種委派式Delegation的事件處理方式,事件源將整個(gè)事件委托給事件監(jiān)聽(tīng)器,由監(jiān)聽(tīng)器對(duì)事件進(jìn)行響應(yīng)處理。這種處理方式將事件源和事件監(jiān)聽(tīng)器分離,有利于提供程序的可維護(hù)性。

舉例:

View類中的OnLongClickListener監(jiān)聽(tīng)器定義如下:(不需要傳遞事件)

public interface OnLongClickListener {   boolean onLongClick(View v); } public interface OnLongClickListener {  boolean onLongClick(View v);}

 View類中的OnLongClickListener監(jiān)聽(tīng)器定義如下:(需要傳遞事件MotionEvent)

public interface OnTouchListener {   boolean onTouch(View v, MotionEvent event); } public interface OnTouchListener {  boolean onTouch(View v, MotionEvent event);}

二 基于回調(diào)的事件處理

相比基于監(jiān)聽(tīng)器的事件處理模型,基于回調(diào)的事件處理模型要簡(jiǎn)單些,該模型中,事件源和事件監(jiān)聽(tīng)器是合一的,也就是說(shuō)沒(méi)有獨(dú)立的事件監(jiān)聽(tīng)器存在。當(dāng)用戶在GUI組件上觸發(fā)某事件時(shí),由該組件自身特定的函數(shù)負(fù)責(zé)處理該事件。通常通過(guò)重寫(xiě)Override組件類的事件處理函數(shù)實(shí)現(xiàn)事件的處理。

 舉例:

View類實(shí)現(xiàn)了KeyEvent.Callback接口中的一系列回調(diào)函數(shù),因此,基于回調(diào)的事件處理機(jī)制通過(guò)自定義View來(lái)實(shí)現(xiàn),自定義View時(shí)重寫(xiě)這些事件處理方法即可。

public interface Callback {   // 幾乎所有基于回調(diào)的事件處理函數(shù)都會(huì)返回一個(gè)boolean類型值,該返回值用于   // 標(biāo)識(shí)該處理函數(shù)是否能完全處理該事件 // 返回true,表明該函數(shù)已完全處理該事件,該事件不會(huì)傳播出去 // 返回false,表明該函數(shù)未完全處理該事件,該事件會(huì)傳播出去    boolean onKeyDown(int keyCode, KeyEvent event);    boolean onKeyLongPress(int keyCode, KeyEvent event);    boolean onKeyUp(int keyCode, KeyEvent event);    boolean onKeyMultiple(int keyCode, int count, KeyEvent event); } public interface Callback {  // 幾乎所有基于回調(diào)的事件處理函數(shù)都會(huì)返回一個(gè)boolean類型值,該返回值用于  // 標(biāo)識(shí)該處理函數(shù)是否能完全處理該事件// 返回true,表明該函數(shù)已完全處理該事件,該事件不會(huì)傳播出去// 返回false,表明該函數(shù)未完全處理該事件,該事件會(huì)傳播出去    boolean onKeyDown(int keyCode, KeyEvent event);    boolean onKeyLongPress(int keyCode, KeyEvent event);    boolean onKeyUp(int keyCode, KeyEvent event);    boolean onKeyMultiple(int keyCode, int count, KeyEvent event);}

三、比對(duì)

基于監(jiān)聽(tīng)器的事件模型符合單一職責(zé)原則,事件源和事件監(jiān)聽(tīng)器分開(kāi)實(shí)現(xiàn);

Android的事件處理機(jī)制保證基于監(jiān)聽(tīng)器的事件處理會(huì)優(yōu)先于基于回調(diào)的事件處理被觸發(fā);

某些特定情況下,基于回調(diào)的事件處理機(jī)制會(huì)更好的提高程序的內(nèi)聚性。

四、基于自定義監(jiān)聽(tīng)器的事件處理流程

在實(shí)際項(xiàng)目開(kāi)發(fā)中,我們經(jīng)常需要自定義監(jiān)聽(tīng)器來(lái)實(shí)現(xiàn)自定義業(yè)務(wù)流程的處理,而且一般都不是基于GUI界面作為事件源的。這里以常見(jiàn)的app自動(dòng)更新為例進(jìn)行說(shuō)明,在自動(dòng)更新過(guò)程中,會(huì)存在兩個(gè)狀態(tài):下載中和下載完成,而我們的程序需要在這兩個(gè)狀態(tài)做不同的事情,“下載中”需要在UI界面上實(shí)時(shí)顯示軟件包下載的進(jìn)度,“下載完成”后,取消進(jìn)度條的顯示。這里進(jìn)行一個(gè)模擬,重點(diǎn)在說(shuō)明自定義監(jiān)聽(tīng)器的事件處理流程。

4.1)定義事件監(jiān)聽(tīng)器如下:

public interface DownloadListener{  public void onDownloading(int porgress);//下載過(guò)程中的處理函數(shù)  public void onDownload();//下載完成的處理函數(shù)}

4.2)實(shí)現(xiàn)下載操作的工具類代碼如下:

public class DownloadUtils{  private static DownloadUtils instance=null;  private private(){  }  public static synchronized DownloadUtils instance(){   if(instance==null){   instance=new DownloadUtils();   }   returns instance;  } }private boolean is Downloading=ture;private int progress=0;//實(shí)際開(kāi)發(fā)中這個(gè)函數(shù)需要傳人url作為參數(shù),以獲取服務(wù)器端安裝包位置public void download(DownloadListener listener)throws interruptdeException{while (isDownloading){     listener.onDownloading(progress);     //下載過(guò)程的簡(jiǎn)單模擬 Thread.sleep(1000);     progress+=10;  if(progress>=100){  isDownloading=false;   }}//下載完成listener.onDownload();}}

4.3)最后在main函數(shù)中模擬事件源:

public class DownloadUI{  public static void main(sting[] args){     try{   DownloadUtils.instance().download(new MyDownloadListener()); }catch(InterruptedExceptiob e){ e.printStackTrace(); } } private static class MyDownloadListener implements DownloadListener{ @Overridepublic void onDownloading(int progress){system.out.println("下載進(jìn)度是:"+progress);} @Overridepublic void onDownloaded(){system.out.println("下載完成")} }}

運(yùn)行一下的模擬程序,輸入如下所示:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 寿阳县| 循化| 衡阳县| 裕民县| 陇南市| 酒泉市| 望江县| 个旧市| 长岭县| 山阳县| 肇庆市| 曲沃县| 米脂县| 揭阳市| 镇沅| 马边| 砚山县| 兰考县| 安达市| 秦皇岛市| 汉寿县| 高要市| 拉孜县| 青海省| 九台市| 伊宁市| 江永县| 蚌埠市| 正蓝旗| 通化县| 酒泉市| 同江市| 云龙县| 米易县| 东乌珠穆沁旗| 镇雄县| 讷河市| 沂南县| 岚皋县| 江口县| 广宗县|