Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Java和Android回調機制

Java和Android回調機制

編輯:關於Android編程

回調介紹

所謂回調,就是客戶程序Client調用服務程序Service中的某個方法A,然後Service又在某個時候反過來調用Client中的某個方法B,對於Client來說,這個B便叫做回調函數。
這裡寫圖片描述

回調的如何實現的呢

Java的回調是通過接口或者內部類來實現的。

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

代碼案例

這裡就上面的講解寫一個最簡單的例子:
第一步:因為方法的回調是通過接口來實現的所以要定義一個接口(我們稱它為回調接口)

/**
 * 定義一個回調接口,包含一個回調函數
 * @author Administrator
 */
public interface CallBack {
    /**
     * 這就是Service回調Client的方法
     * @param result 回調時攜帶的參數(可選)
     */
    public void B(String result);
}

/**
 * 這個Client類, 實現CallBack接口(條件一)
 * @author Administrator
 *
 */
public class Client implements CallBack{

    /**
     * Client類 包含 Service類 的引用 (條件二)  因為Client要調用Service中的方法
     */
    Service service = new Service();//可直接實例化或在構造函數或某個方法中進行實例化

    /**
     * 該方法用於請求Service調用Service中的方法
     */
    public void requrst(){
        System.out.println("請求服務器調用服務器的方法");
        service.A(this);//傳入當前對象也就是CallBack對象,因為Client實現類CallBack接口
    }



    /**
     * Service回調Client的實現方法
     */
    @Override
    public void B(String result) {
        // TODO Auto-generated method stub
        System.out.println("服務器回調我的方法返回的結果是:"+result);
    }

}
public class Service {

    CallBack callback;//定義接口類型對象,要調用接口中的回調方法

    String result = "謝謝你的請求";

    public void sendManage(Client client) {
        this.callback = client;
        callback.B(result);//調用的是該接口的實現方法(即Client中的B)
    }


}

測試類

 

public class Test {
    public static void main(String[] args) {
        Client client = new Client();
        client.requrst();
    }
}

 

輸出結果:

請求服務器調用服務器的方法
服務器回調我的方法返回的結果是:謝謝你的請求

回調實現的步驟

以上就是一個簡單實現接口回調的機制,我們總結一下實現的所需的步驟:
1、定義回調接口和回調方法
2、Client實現回調接口和回調方法,並在Client中包含Service引用,通過引用調用Servie中的方法並且必須傳入一個當前對象Client(因為當前對象實現了CallBack接口所以也屬於接口對象)
3、在Service中定義一個接口對象並在方法中對初始化(將Client傳過來的當前對象賦值給接口對象),通過接口對象調用接口中方法(調用的Client實現的接口方法)
4、測試

回調的綜合案例(異步+回調)

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

案例實現接口回調的步驟:
1.定義一個回調接口包含回調方法(這是接口約定,有答案時電話聯系)
2.我(Me.java)這個類實現回調接口和提供回調方法的實現,並向你注冊回調(因為只有向你注冊了回調你才能回調我的方法告訴我答案)
3.你(You.java)這個類提供了接收問題並回答(回答就是我向你注冊的回調參數類型為接口對象)的方法
4.測試類

/**
 * 定義一個回調接口,包含一個回調函數
 * @author Administrator
 */
public interface CallBack {
    /**
     * 當你知道答案可以調用該回調函數告訴我答案
     * @param result 答案
     */
    public void solve(String result);
}
/**
 * 這個類代表我,因為你要告訴我答案所以要實現CallBack回調接口和接口中的回調方法的實現
 * 我要向你提問所以有一個提問的方法askQqstion(),在提問的同時要向對方(你)注冊回調接口,當你知道答案的時候調用我裡面的接口實現方法,最後得到答案
 * @author Administrator
 *
 */
public class Me implements CallBack{

    /**
     * 我(Me)這裡包含一個對你(You)的引用
     * 因為我(Me)要調用你(You)裡面的方法向你詢問(問題的描述)和注冊回調(用於你告訴我答案)
     */
    private You you;

    public Me(You you){
        this.you = you;     //實例化引用
    }


    /**
     * 我通過這個方法向你進行提問,在提問時進行回調注冊,讓你在知道答案是可以告訴我
     * @param question  問題的描述
     */
    public void askQqstion(final String question){

        //異步
        new Thread(new Runnable() {

            @Override
            public void run() {
                /**
                 * 我調用你的方法,在這裡向你注冊回調接口
                 */
                you.executeMessage(Me.this, question);              
            }
        }).start();     
    }   


    // 我問完問題後就掛掉電話,讓你去思考問題的答案同時我也可以去做別的事
    public void play(){
        System.out.println("我去完了");
    }


    /**
     *當你知道答案後調用此方法告訴我,就是所謂的回調方法
     */
    @Override
    public void solve(String result) {
        System.out.println("你告訴我的答案是--->"+result);
    }
}
public class You {

    /**
     * 接收我的問題和基友回答問題的
     * @param callBack 接口回調對象,通過該對象可以調用實現了該接口的對象(Me)中的接口實現方法(Me中的solve()方法)
     * @param question 問題描述
     */
    public void executeMessage(CallBack callBack, String question){

        //模擬你要思考很長時間
        for(int i=0;i<10000;i++){

        }   


        /**
         * 想到了答案
         */
        String result = "答案就是我也不知道";    


        /**
         * 想到後你就打電話告訴我,放過來調用我這個類中的回調方法
         */
        callBack.solve(result);     
    }
}
/**
 * 測試類
 * @author Administrator
 *
 */
public class Test {

    public static void main(String[] args) {
        //兩個對象一個我一個你
        You you = new You();
        Me me = new Me(you);

        //我向你提問
        me.askQqstion("世界到底有多大?");
    }
}

輸出結果:

你告訴我的答案是—>答案就是我也不知道

回調函數(方法)小總結:

1.回調函數也是一個函數或過程,不過它是一個由調用方自己實現,供被調用方使用的特殊函數。
2.即調用方A不直接使用此函數function,而是通過調用被調用方B來間接調用function。

通過上面的那個例子你是不是差不多明白了回調機制呢,上面是一個異步回調,就是我去做我的事但是我還是在等你的答案,相應的也有同步回調。線程run()也是一個回調方法,當執行Thread的start()方法就會回調這個run()方法,還有處理消息都比較經典等等

Android中的回調機制

比較笨的一種認識:Android中以on開頭的方法都是回調方法:onCreate (),onStart (),onPause (),onStop()等等。
在Activity中定義了很多生命周期的不同狀態要調用的方法,這些方法都是空實現,系統框架要調用,用戶也要調用來實現。
1.以上可以看出,接口(系統框架)是系統提供的,接口的實現是用戶實現的,這樣可以達到接口統一,實現不同的效果。   
2.系統在不同的狀態“回調”我們的實現類,來達到接口和實現的分類。


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved