在WINDOWS中,程式員想讓系統DLL調用自己編寫的一個方法,於是利用DLL當中回呼函數(CALLBACK)的介面來編寫程式,使它調用,這個就稱為回調。在調用介面時,需要嚴格的按照定義的參數和方法調用,並且需要處理函數的非同步,否則會導致程式的崩潰。這樣的解釋似乎還是比較難懂,這裡舉個簡單的例子,程式員A寫了一段程式(程式a),其中預留有回呼函數介面,並封裝好了該程式。程式員B要讓a調用自己的程式b中的一個方法,於是,他通過a中的介面回調自己b中的方法。目的達到。在C/C++中,要用回呼函數,被調函數需要告訴調用者自己的指標地址,但在JAVA中沒有指標,怎麼辦?我們可以通過介面(interface)來實現定義回呼函數。
假設我是程式員A,以下是我的程式a:
public class Caller {private MyCallInterface mc;public Caller() {}public void setMyCallInterface(MyCallInterface mc) {this.mc = mc;}public void call() {mc.fuc();}// Caller的調用方法}
這裡需要定義一個介面,以便程式員B根據我的定義編寫程式實現介面。
public interface MyCallInterface {public void fuc();}
於是,程式員B只需要實現這個介面就能達到回調的目的了:
public class Callee implements MyCallInterface {@Overridepublic void fuc() {System.out.println("我被Caller調用了!");}}
下面是調用過程:
public class Callbacks {public static void main(String[] args) {MyCallInterface callee = new Callee();Caller caller = new Caller();caller.setMyCallInterface(callee);caller.call();}}
在以上代碼中,caller是調用者,callee是被調用者,callbacks表示調用過程。
先產生了Callee對象,利用這個callee對象產生的Caller對象則攜帶了一些資訊(即與Callee對象的關聯),所以Caller對象可以利用自己的call方法調用Callee的方法。——這就是整個回調過程。
B產生A,則A具有調用B的方法的能力。caller中具有的介面引用很關鍵。實現了此介面引用的callee只需將自己的引用傳給Caller。
一般來說分為以下幾步:
- 聲明回呼函數的統一介面interface A,包含方法fuc();
- 在調用類caller內將該介面設定為私人成員private A XXX;
- 在caller內提供一個public方法,可以將外部“該介面A的實作類別的引用”通過形參傳給XXX;
- caller的某個方法call()中會用到XXX.fuc()方法;
- 在caller的執行個體中,將實現了A介面的對象的引用傳給caller,後調用call()方法
本文來源。