Android中的回調

在編寫Android程序的時候,我們經常會寫到類似這樣的程序:

Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    //do something
    }
});

當指定的button被按下時便會觸發onClick()方法,這個便是Android中被廣泛使用的回調。回調可以簡單地這樣理解:Class A調用了Class B的方法C,在方法C中Class B又回過頭調用了Class A的方法D,這一過程便被稱爲回調,方法D被稱爲Class A的回調函數。

那麼如何定義一個回調呢?這其實是有一定套路的,如下:
(1)定義接口:在類中定義一個Interface,並在接口中定義一個抽象方法;
(2)接口對象:在類中定義一個該接口的成員變量;
(3)設置對象:在類中定義一個公共的方法,可以設置這個接口的對象,調用該方法給接口對象成員變量賦值;
(4)調用方法:在合適的位置調用接口對象中的方法。
以上套路來源於網絡,不過看上去還是有些抽象,下面將用代碼直觀地解釋一下:

public interface Callback {//第一步:定義接口
    public void onClick();
}

public class Button {
    private Callback listener;//第二步:接口對象

    public void click() {
        listener.onClick();//第四步:調用方法
    }

    /***第三步:設置對象***/
    public void setOnclickListener(Callback listener) {
        System.out.println("Button:註冊監聽(其實就是將Button與實際回調函數綁定)");
        this.listener = listener;
    }

    public static void main(String[] args) {
        Button btn = new Button();
        btn.setOnclickListener(new Callback(){//調用Button的setOnclickListener方法

            @Override
            public void onClick() {
                System.out.println("onClick:回調");
            }

        });
        btn.click();//Button調用了Callback的onClick方法,這裏即爲回調
    }
}

代碼具體地對應哪一個步驟註釋中已經給出,其實稍作整理之後會發現實際上Android的回調機制並不難以理解。不過有的人估計還是會疑惑(比如我- -):回調機制的本質不就只是A調用B,然後B再回過頭調用A而已嗎,爲什麼要抽象出一個接口來呢?比方說下面的代碼:

public class Employee {
    public void work(Boss boss){
        System.out.println("Boss叫我工作。。。");
        String result = "工作完成了!";
        boss.result(result);//Employee調用Boss的result方法,回調
    }
}

public class Boss {
    public Boss(Employee employee) {
        employee.work(this);//Boss調用Employee的work方法
    }

    public void result(String result) {
        System.out.println(result);
    }

    public static void main(String[] args) {
        Employee employee = new Employee();
        Boss boss = new Boss(employee);
    }
}

上面的代碼通過不使用接口的方法來實現回調功能,顯然這樣也是可以的。但是我們要考慮到一個情況,你的Boss可能有多位,如果是按照上面代碼的邏輯,那麼你就需要在Employee中重載多個work方法,這樣就讓代碼顯得臃腫了,而通過抽象出一個接口,讓不同的Boss類根據各自需要分別實現該接口,而作爲下屬的Employee則只要通過一個接口便可以和多個Boss彙報情況,還是比較抽象?請看下面代碼:

public interface Callback {
    public void result(String result);
}

public class Employee {

    public void work(Callback callback) {
        System.out.println("Boss叫我工作。。。");
        String result = "報告"+callback.toString()+"工作完成了!";
        callback.result(result);//Employee調用callback的result方法,回調
    }
}

public class Boss implements Callback{

    public Boss(Employee employee) {
        employee.work(this);//Boss調用Employee的work方法
    }

    @Override
    public void result(String result) {
        System.out.println(result);
    }

    public static void main(String[] args) {
        Employee employee = new Employee();
        Boss boss = new Boss(employee);     
    }
}

由於回調在Android中如此的普遍,所以充分理解回調機制將有助於我們對Android編程的理解。

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