標籤:android style blog http io color ar os java
平時在寫程式時經常會遇到監聽器,比如按鈕的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();//介面裡面要實現的方法 } }View Code
二、調用回呼函數
我這裡是在Activity中綁定介面,實際代碼如下:
public class MainActivity extends Activity implements CallerClass.CallBack{ private CallerClass caller; ...}
繼承了CallerClass中的CallBack介面,Out方法如下:
@Override public void Out() { // TODO Auto-generated method stub System.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; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); caller = new CallerClass(); caller.setCallBack(this); caller.Out(); } @Override public void Out() { // TODO Auto-generated method stub System.out.println("這是Activity上的輸出"); }}
三、結果
Perfect~
interface的作用感覺和C++中的指標差不多,它是一個地址的引用,但沒有產生記憶體。所以我們能夠預先為程式賦予要執行的方法。不止如此,interface在設計模式的作用更是強大,原廠模式,建造者模式,觀察者模式無不用到interface。
Android的簡單應用(三)——為你的程式添加監聽器