平時在寫程序時經常會遇到監聽器,比如按鈕的click監聽器,按鍵監聽器等等。而android中的監聽器和java中的回調函數是同一個概念,都是在底層代碼中定義一個接口來調用高層的代碼。那么什么是回調函數呢?網上說的是“在WINDOWS中,程序員想讓系統DLL調用自己編寫的一個方法,于是利用DLL當中回調函數(CALLBACK)的接口來編寫程序,使它調用,這個就稱為回調。在調用接口時,需要嚴格的按照定義的參數和方法調用,并且需要處理函數的異步,否則會導致程序的崩潰。這樣的解釋似乎還是比較難懂,這里舉個簡單的例子,程序員A寫了一段程序(程序a),其中預留有回調函數接口,并封裝好了該程序。程序員B要讓a調用自己的程序b中的一個方法,于是,他通過a中的接口回調自己b中的方法。”按照我的理解就是在程序A中先挖了一個坑,然后等著你在程序B中去填里面的內容。不填?那就是被坑咯~
?
一、定義回調函數
- 建立一個類,其中包括一個接口的變量
private CallBack callBack;//接口的變量
- 建立一個接口的聲明
public interface CallBack{public void Out();//接口里面要實現的方法 }
- 在類中與接口綁定(或者說獲得接口的引用)
public void setCallBack(CallBack callBack){this.callBack = callBack;}public void Out(){callBack.Out();System.out.println("這是CallerClass的輸出");}
- 整個類
public class CallerClass {private CallBack callBack;//接口的聲明public CallerClass(){};public void setCallBack(CallBack callBack){this.callBack = callBack;}public void Out(){callBack.Out();System.out.println("這是CallerClass的輸出");}public interface CallBack{public void Out();//接口里面要實現的方法}}
?
二、調用回調函數
我這里是在Activity中綁定接口,實際代碼如下:
public class MainActivity extends Activity implements CallerClass.CallBack{ private CallerClass caller; ...}
繼承了CallerClass中的CallBack接口,Out方法如下:
@Overridepublic void Out() {// TODO Auto-generated method stubSystem.out.println("這是Activity上的輸出");}
?
最后在onCreate中調用CallerClass的Out()方法:
caller = new CallerClass(); caller.setCallBack(this); caller.Out();
完整代碼:
public class MainActivity extends Activity implements CallerClass.CallBack{private CallerClass caller;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);caller = new CallerClass();caller.setCallBack(this);caller.Out();}@Overridepublic void Out() {// TODO Auto-generated method stubSystem.out.println("這是Activity上的輸出");}}
?
?
?
三、結果
Perfect~
interface的作用感覺和C++中的指針差不多,它是一個地址的引用,但沒有生成內存。所以我們能夠預先為程序賦予要執行的方法。不止如此,interface在設計模式的作用更是強大,工廠模式,建造者模式,觀察者模式無不用到interface。