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

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

Android 回調(diào)詳解及簡(jiǎn)單實(shí)例

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

Android  回調(diào)

前言:

Android中的回調(diào)最經(jīng)典的就是點(diǎn)擊事件設(shè)置監(jiān)聽(tīng)(一般通過(guò)switch(v.getId()))這里寫(xiě)個(gè)最基本的

btn_rigister.setOnClickListener(new View.OnClickListener() {   @Override   public void onClick(View view) {     // TODO log in   } }); 

view對(duì)外暴露了一個(gè)接口onClick

public interface OnClickListener {     /**      * Called when a view has been clicked.      *      * @param v The view that was clicked.      */     void onClick(View v);   } 

我們?cè)谟玫臅r(shí)候?qū)崿F(xiàn)具體方法寫(xiě)了處理時(shí),當(dāng)前的Actvity是沒(méi)有對(duì)這個(gè)方法做任何操作,這個(gè)被充實(shí)之后的onClick方法被view回調(diào)處理!其中一段處理 比如

public boolean callOnClick() {     ListenerInfo li = mListenerInfo;     if (li != null && li.mOnClickListener != null) {       li.mOnClickListener.onClick(this);       return true;     }     return false;   } 

具體可以閱讀View.java

2、什么是回調(diào)

回調(diào)其實(shí)是一種雙向調(diào)用模式,也就說(shuō)調(diào)用方在接口被調(diào)用時(shí)也會(huì)調(diào)用對(duì)方的接口,聽(tīng)起來(lái)就很拗口,翻譯翻譯就是“實(shí)現(xiàn)了抽象類(lèi)/接口 的實(shí)例實(shí)現(xiàn)了父類(lèi)的提供的抽象方法,后,將該方法交還給父類(lèi)來(lái)處理”,口訣念3遍,可以體會(huì)到其中的內(nèi)涵了沒(méi)?

主要要弄清楚一點(diǎn),實(shí)現(xiàn)方法交還給提供接口的父類(lèi)處理!

3、為什么要用回調(diào)

這里體現(xiàn)了Java面向?qū)ο蟮摹叭f(wàn)事萬(wàn)物皆為對(duì)象”,我們需要將普通物體的特性抽象出來(lái),共性之中又有特性,每個(gè)不同的特性就需要交給特定的情況處理,通過(guò)暴露接口方法可以減少很多重復(fù),代碼更加優(yōu)雅。
比如view具有被點(diǎn)擊的通性,但是每個(gè)點(diǎn)擊又會(huì)產(chǎn)生不一樣的事件處理一樣,因此android對(duì)外暴露一個(gè)接口有個(gè)onClick方法,你需要處理啥你就寫(xiě)啥,view只會(huì)調(diào)用這個(gè)方法,具體怎么處理你已經(jīng)自己為不同的點(diǎn)擊事件做了處理了。

4、如何寫(xiě)

一個(gè)很好的小栗子

【定義接口】 在類(lèi)中定義一個(gè)Interface, 并在接口中定義一個(gè)抽象方法

public interface Callback{      public abstract void work();    }  

【接口對(duì)象】在類(lèi)中定義一個(gè)該接口的成員變量

private Callback mCallback;  

 【設(shè)置對(duì)象】在類(lèi)中定義一個(gè)公共方法,可以設(shè)置這個(gè)接口的對(duì)象,調(diào)用該方法給接口對(duì)象變量賦值

public void setCallback(Callback callback) {      this.mCallback = callback;    }  

【調(diào)用方法】調(diào)用接口對(duì)象中的方法

public void doWork() {      mCallback.work();    }  

ok,

完整代碼如下

public class Employee {    /*    * 定義回調(diào)接口的成員變量    */    private Callback mCallback;    /*    * 聲明回調(diào)接口    */    public interface Callback{      public abstract void work();    }    /*    * 設(shè)置回調(diào)接口對(duì)象成員變量    */    public void setCallback(Callback callback) {      this.mCallback = callback;    }    /*    * 調(diào)用回調(diào)接口對(duì)象中的方法    */    public void doWork() {      mCallback.work();    }  }  

然后我們針對(duì)去使用就好

public class Boss {    private Employee employee;    /*    * 為Employee設(shè)置回調(diào)函數(shù), 在這里定義具體的回調(diào)方法    */    public void setCallback() {      employee.setCallback(new Employee.Callback() {        @Override        public void work() {          System.out.println("work");        }      });    }  }  

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 陆河县| 美姑县| 盐亭县| 正镶白旗| 肃北| 龙南县| 瑞昌市| 保定市| 宁化县| 滨海县| 囊谦县| 余庆县| 南雄市| 大庆市| 珲春市| 绥化市| 绵竹市| 二连浩特市| 科尔| 铜山县| 凤山县| 滦南县| 余干县| 英德市| 沂源县| 佛冈县| 宁强县| 康定县| 达州市| 云梦县| 渑池县| 双流县| 榆树市| 水富县| 通山县| 沙田区| 合水县| 宁河县| 阳泉市| 蚌埠市| 高雄县|