Android回調機制的討論

來源:互聯網
上載者:User

一、回呼函數

回呼函數就是一個通過函數指標調用的函數。如果你把函數的指標(地址)作為參數傳遞給另一個函數,當這個指標被用為調用它所指向的函數時,我們就說這是回呼函數。回呼函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。

詳細解釋:

客戶程式C調用服務程式S中的某個函數A,然後S又在某個時候反過來調用C中的某個函數B,對於C來說,這個B便叫做回呼函數。例如Win32下的視窗過程函數就是一個典型的回呼函數。一般說來,C不會自己調用B,C提供B的目的就是讓S來調用它,而且是C不得不提供。由於S並不知道C提供的B姓甚名誰,所以S會約定B的介面規範(函數原型),然後由C提前通過S的一個函數R告訴S自己將要使用B函數,這個過程稱為回呼函數的註冊,R稱為註冊函數。Web
Service以及Java的RMI都用到回調機制,可以訪問遠程伺服器程式。

下面舉個通俗的例子:
某天,我打電話向你請教問題,當然是個難題,^_^,你一時想不出解決方案,我又不能拿著電話在那裡傻等,於是我們約定:等你想出辦法後打手機通知我,這樣,我就掛掉電話辦其它事情去了。過了XX分鐘,My Phone響了,你興高采烈的說問題已經搞定,應該如此這般處理。故事到此結束。這個例子說明了“非同步+回調”的編程模式。其中,你後來打手機告訴我結果便是一個“回調”過程;My Phone號碼必須在以前告訴你,這便是註冊回呼函數;My Phone號碼應該有效並且手機能夠接收到你的呼叫,這是回呼函數必須符合介面規範。

JAVA中不允許直接操作指標,那它的回調是如何?的呢?
答案:它是通過介面或者內部類來實現的。

JAVA方法回調是功能定義和功能實現分享的一種手段,是一種耦合設計思想。作為一種架構,必須有自己的運行環境,並且提供使用者的實現介面。

1. 定義介面 Callback ,包含回調方法 callback()

2. 在一個類Caller 中聲明一個Callback介面對象 mCallback

3. 在程式中賦予 Caller對象的介面成員(mCallback) 一個內部類對象如

new  Callback(){

     callback(){

         //函數的具體實現

     }

這樣,在需要的時候,可用Caller對象的mCallback介面成員 調用callback()方法,完成回調.

二、回調機制在Android架構中的使用

這裡有幾個例子:

1、在Activity中定義了很多生命週期的不同狀態要調用的方法,這些方法都是空實現,系統架構要調用,使用者也要調用來實現。

執行個體(對於Android介面上Button點擊事件監聽的類比):
a.定義介面

public interface OnClickListener {    public void OnClick(Button b);

b. 定義Button

public class Button {  OnClickListener listener;   public void click() {    listener.OnClick(this);  }  public void setOnClickListener(OnClickListener listener) {    this.listener = listener;  }}

c. 將介面對象OnClickListener 賦給 Button的介面成員

public class Activity {  public Activity() {  }  public static void main(String[] args) {    Button button = new Button();    button.setOnClickListener(new OnClickListener(){       @Override       public void OnClick(Button b) {                 System.out.println("clicked");       }       });    button.click(); //user click,System call button.click();  }}

2、在Activity中定義了很多生命週期的不同狀態要調用的方法,這些方法都是空實現,系統架構要調用,使用者也要調用來實現。

執行個體(對於Android介面上Activity的類比):

a.定義介面

public interface Activity{  public void onCreate();  .....  public void onDestory();}

b.Activity介面的實作類別MyActivity

//定義一個類實現Activity介面public calss MyActivity implements Activity{@Override//實現方法,簡單輸出  public void onCreate(){    System.out.println("onCereate");}....@Override//實現方法,簡單輸出  public void onDestory(){    System.out.println("onDestory");}}

c.系統運行環境類AndroidSystem

//系統運行安裝類public class AndroidSystem{  //定義常量  public static final int CREATE=1;  ....  public static final int DESTORY=2;  //運行方法  public void run(Activity a,int state){    switch(state){      case CREATE:        a.onCreate;  break;  ....      case DESTORY:a.onDestory();  break;}}}

d.測試類別

//測試類別publilc class Test{  public static void main(String[] args){  //執行個體化AndroidSystem  AndroidSystem system = new AndroidSystem();  //執行個體化MyActivity  Activity a = new MyActivity();  system.run(a,AndroidSystem.CREAATE);  ....  system.run(a,AndroidSystem.DESTORY);}}

以上可以看出,介面(系統架構)是系統提供的,介面的實現是使用者實現的,這樣可以達到介面統一,實現不同的效果。
系統在不同的狀態“回調”我們的實作類別,來達到介面和實現的分類。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.