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

首頁 > 系統 > Android > 正文

Android 的回調事件詳解

2019-12-12 05:40:46
字體:
來源:轉載
供稿:網友

看見網上一些回調的解釋都很復雜的,特別基于Android的自定義回調,感覺一頭霧水,于是乎,我也寫了這篇基于我對回調的解釋。

先來看一個簡單的例子:
有兩個類 ClassA ,和 ClassB, ClassA調用ClassB里面的方法,

public class ClassB {  public void method_from_classB(){        for(int i=0;i<10;i++)      System.out.print("..."+i);  }}public class ClassA {       public static void main(String args[]){       ClassB classB = new ClassB();        classB.method_from_classB();  }}

輸出:

...0...1...2...3...4...5...6...7...8...9

臥槽,哪個傻逼寫的博文,侮辱我的智商不是嗎,嘻嘻,是為了做比較,接下來看看利用回調, ClassA 是怎么調用 ClassB中的 方法的,注意是回調:

讓ClassB 實現 ClassA定義的接口

public class ClassB implements ClassA.ClassAInterface{  public ClassB(){        new ClassA().RegisterInterface(this);    System.out.println("...ClassB..."+this);  }  @Override  public void method_from_interface() {    for(int i=0;i<10;i++)      System.out.print("..."+i);  }    /*  public void method_from_classB(){    for(int i=0;i<10;i++)    System.out.print("..."+i);  }*/}

ClassA里面定義接口和抽象方法:

public class ClassA {  public static ClassAInterface classAInterface;    public interface ClassAInterface{        public void method_from_interface();  }  public void RegisterInterface(ClassAInterface a_interface){    this.classAInterface = a_interface;    System.out.println("...a_interface..."+a_interface);  }   public static void main(String args[]){       ClassB classB = new ClassB();// 標記@1,最后面做解釋    //classB.method_from_classB();    System.out.println("...classAInterface..."+classAInterface);     if(classAInterface != null){        classAInterface.method_from_interface();      }  }}

輸出:

...0...1...2...3...4...5...6...7...8...9

整理下,也就是 我在ClassA里面定義了一個接口(interface),接口里面又定義了一個方法,但沒有方法體,也就不做任何事情。

當 ClassA 執行到 mian() 函數時,就會調用接口的方法,但前面講了,接口的方法沒有實現具體的事情,它就會找到 ClassB 里面對應的 方法,來實現具體的事情。

呦呦呦,ClassA 的接口的方法是怎么找到 ClassB 的方法,難道會上天???

也就是下面分析這句代碼是怎么上天的:

// 利用接口的回調實現 ClassB中 的方法的 具體事情

 classAInterface.method_from_interface();

我在上面的代碼中用 System.out.println 打印出了日志做分析:

第一個(ClassA中的方法):

  public void RegisterInterface(ClassAInterface a_interface){    this.classAInterface = a_interface;    System.out.println("...a_interface..."+a_interface);  }

輸出:

...a_interface...ClassB@3ddb8962

第二個:

public ClassB(){        new ClassA().RegisterInterface(this);    System.out.println("...ClassB..."+this);  }

輸出:

...ClassB...ClassB@3ddb8962

第三個:

System.out.println("...classAInterface..."+classAInterface);     if(classAInterface != null){        classAInterface.method_from_interface();      }

輸出:

...classAInterface...ClassB@3ddb8962

看到這里是不是恍然大悟呢 ,輸出都是 “ ClassB@3ddb8962 ” 也就是ClassB 對象的引用!!!

啊!接口只不過是將 ClassB 對象的引用 傳到 ClassA中而已,那這句會上天的語句是不是很好解釋了呢。

       classAInterface.method_from_interface();

相當于  ClassB@3ddb8962.method_from_interface();

這是不是跟最上面到的代碼:

    ClassB classB = new ClassB();      classB.method_from_classB();

一樣呢,這也是為什么我最開始要舉這個例子的原因!!!

相信看到這里應該理解了接口的回調是怎么回事了吧。
但有一點又糊涂了,為什么 要接口回調這么麻煩的,最上面的在ClassA里面執行:

    ClassB classB = new ClassB();      classB.method_from_classB();

不是照樣可以 ClassA 調用 ClassB 里面的 方法。。。。但要是ClassA 要調用ClassC,ClassD ...,里面的方法呢,是不是還要改變ClassA里面的代碼,實例化ClassC,ClassD ... 的對象,顯然是不好的,要是使用接口那就不用改變ClassA 里面的代碼了,任何類只要實現ClassA 里面的接口就可以.

解釋一下 標記@1 :

上面那段話好像跟 標記@1 違背了,在 ClassA 里面確實也需要實例化 ClassB對象。

因為要 【利用】 初始化的時候執行構造方法里面的代碼:

public ClassB(){    // 相當于回調事件的注冊,初學者出現回調空指針很有可能這邊忘記‘注冊'了    new ClassA().RegisterInterface(this);  }

將this 傳遞給 ClassA ,作用也就是 上面利用 日志分析的作用。

但再 Android 開發中救你不必這樣了,
可以在 Activity 的初始化時執行:

@Override  protected void onCreate(Bundle savedInstanceState) {     // 相當于回調事件的注冊,初學者出現回調空指針很有可能這邊忘記‘注冊'了    new ClassA().RegisterInterface(this);}

在Android 開發中 ClassA 里面的 mian() 函數可以用事件來代替,觸發:
如:

button.setOnClickListener(new OnClickListener() {            @Override      public void onClick(View v) {        // TODO 自動生成的方法存根        if(classAInterface != null){        classAInterface.method_from_interface();      }    });

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 贵港市| 焉耆| 邵阳市| 盐城市| 凤城市| 邵武市| 东至县| 英吉沙县| 玉门市| 重庆市| 仙游县| 徐州市| 泾阳县| 抚顺县| 武陟县| 汾西县| 黎城县| 韶山市| 疏附县| 阿拉善盟| 木兰县| 桦甸市| 灯塔市| 富宁县| 威信县| 固始县| 汉中市| 青铜峡市| 广汉市| 南城县| 黄山市| 宜宾市| 通辽市| 镇雄县| 武宣县| 永川市| 娄烦县| 白水县| 来安县| 广南县| 昆山市|