安卓回調詳細解析

以前對於這個機制理解不夠深刻,現在重新整理下思路。

一、建模

我理解的接口回調就是,我這個類實現了一個接口裏的方法doSomething,然後註冊到你這裏,然後我就去做別的事情去了,你在某個觸發的時機回頭來調用我doSomething的方法。好比,我給你打電話問某個難題,你電話裏想不出來,於是說等想到了再回我電話。於是接口回調機制比喻模型如下

\

第一步:<喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ytfPyKOsxOPO0rXD1Ly2qKOs1eK49sq1z9a1xLe9t6jKx9Wm0fm1xKOsvdDKssO0w/vX1qOs0OjSqrSryOu0q7P2yrLDtKGjzqrKssO00qrV4tH5xNijv8TjztK1w9S8tqi157uwwarPtaOssrvKx86i0MW/27/boaPV4r7NysfUvLaotcS907/aoaM8L3A+CjxwPs7Sw8fUvLaotbHE48/rtb3OyszitcS08LC4vs272M7So6zL+dLU1eLA77SryOuyzsr9ysfE48/rtb21xLTwsLihozwvcD4KPHA+IDwvcD4KPHByZSBjbGFzcz0="brush:java;">public interface ContactInterface { public void callBackByTel(String answer); }

第二步:

我得先打電話(註冊)到你那,告訴你我的問題是什麼。是吧。

所以你那裏必須有個方法讓我告訴你問題相關事宜(註冊)。


?
1
2
3
4
5
public void setCallBack(String who,String question,ContactInterface callBack) {
this.who = who;       
System.out.println("你說:當前聯繫到我的人是"+who+",問題是"+question);
       this.callBack =callBack;
   }

第三步:

當你想到問題的答案後,打電話告訴我答案,即回調我傳進來的方法。


?
1
2
3
4
5
6
7
8
9
10
11
12
13
public void handleThings(){
 //假如你現在正在想問題的答案,需要一點時間
 for(int i=0;i<100000;i++){
              if(i == 0){
                      System.out.println("你正在思考問題.....");
              }
        }
  
 String answer = "答案是A";
 //想到問題的辦法了
 System.out.println("你說:想到答案了,準備打回去給"+who+"告訴他答案");
 callBack.callBackByTel(answer);
 }


OK, 整個機制構成三要素就是:我(客戶端),你(服務端),約定(接口)

我類——

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Me {
 
     public static void main(String[] args){ 
          
         Me me = new Me();
         me.hasQuestion();
          
     }
      
     private void hasQuestion(){
         //現在有問題想不出來答案,想去問你
         You you = new You();
         you.setCallBack("蝸牛", "某道題答案是什麼?", new ContactInterface() {
             
            @Override
            public void callBackByTel(String answer) {
                System.out.println("我說:嗯,好的,我收到答案了:"+answer+",謝謝");
                 
            }
        });
         //你接到電話,起牀開始思考問題
        new Thread(you).start();
     }
}

你類——

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package lin.callback.test;
 
public class You implements Runnable{
 
     
    private String who;
     private ContactInterface callBack; 
     public You() {
            // TODO Auto-generated constructor stub
        }
      
    //調用此方法就表示有人聯繫你了,註冊到你這來
     public void setCallBack(String who,String question,ContactInterface callBack) {
         this.who = who;   
         System.out.println("你說:當前聯繫到我的人是"+who+",問題是"+question);
            this.callBack =callBack;
        }
        
     public void handleThings(){
         //假如你現在正在想問題的答案,需要一點時間
         for(int i=0;i<100000;i++){ 
                  if(i == 0){
                      System.out.println("你正在思考問題.....");
                  }
            }
          
         String answer = "答案是A";
         //想到問題的辦法了
         System.out.println("你說:想到答案了,準備打回去給"+who+"告訴他答案");
         callBack.callBackByTel(answer);
     }
 
    /* (non-Javadoc)
     * @see java.lang.Runnable#run()
     */
    @Override
    public void run() {
        try {
            Thread.sleep(1000);
            handleThings();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
      
      
}

接口類——

?
1
2
3
4
5
public interface ContactInterface {
     
    public void callBackByTel(String answer);
     
}


驗證結果:

\


二、總結

Java 中沒有函數指針這一說,因爲java沒有指針,但是並不代表着它不會使用這個功能。事實上,引用就是實現了指針的功能。

回調方法就是一個通過方法指針來調用的方法。如果我將這個方法的指針(地址,引用)通過形參傳遞到另一個類的某個方法裏,那麼當這個類調用該方法裏面我所傳入的指針時,就能調用我這邊的方法。

整個過程就是我傳入方法A的地址,你接收,並在某個時刻回調我這邊的A方法。

由於java沒辦法操作指針,於是它用接口來實現。

JAVA方法回調是一種耦合設計思想。作爲一種架構,必須有自己的運行環境,並且提供用戶的實現接口。

主要步驟如下:

  • 定義接口 Callback ,包含回調方法 callback();
  • 服務端提供註冊的方法,並設定在某個條件下會回調接口方法;
  • 客戶端提供接口的實現方法,並註冊到服務端,把方法地址傳進去。

    這樣,在需要的時候,可用Caller對象的mCallback接口成員調用callback()方法,完成回調了。

    三、Android中的回調機制

    在android 中回調機制被大量使用。

    比如,在Activity中定義了很多生命週期的不同狀態要調用的方法,這些方法都是空實現,系統框架要調用,用戶也要調用來實現。或者更直接的是按鍵點擊的實現方法。


    ?
    1
    2
    3
    4
    5
    6
    7
    8
    loginButton.setOnClickListener(new OnClickListener() {
      
    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
      
    }
    });

    明顯,OnClickListener就是android 系統所約定好的接口,然後我們寫的應用程序就是客戶端,android 系統就是服務端。模型關係如下圖所示:

    以上可以看出,接口(系統框架)是系統提供的,接口的實現是用戶實現的,這樣可以達到接口統一,實現不同的效果。

    系統在不同的狀態“回調”我們的實現類,來達到接口和實現的分類。

  • 轉自http://www.2cto.com/kf/201412/365788.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章