關於回調函數,網上雖然有很多解答,但發現很難掌握。你懂得了理論,但實際的應用又顯得不知從何下手。憑着我個人單薄的力量,我總結了一個比較容易理解和應用的例子,通過這個例子的學習,我相信很快就能學會回調函數了。
所謂回調,就是客戶程序C調用服務程序S中的某個方法a,然後S又在某個時候反過來調用C中的某個方法b,對於C來說,這個b便叫做回調函數。
一般說來,C不會自己調用b,C提供b的目的就是讓S來調用它,而且是C不得不提供。由於S並不知道C提供的b叫甚名誰,所以S會約定b的接口規範(函數原型),然後由C提前通過S的一個函數r告訴S自己將要使用b函數,這個過程稱爲回調函數的註冊,r稱爲註冊函數。
下面舉個通俗的例子:
某天,我打電話向你請教問題,當然是個難題,:),你一時想不出解決方法,我又不能拿着電話在那裏傻等,於是我們約定:等你想出辦法後打手機通知 我,這樣,我就掛掉電話辦其它事情去了。過了XX分鐘,我的手機響了,你興高采烈的說問題已經搞定,應該如此這般處理。故事到此結束。
這個例子說明了“異步+回調”的編程模式。其中,你後來打手機告訴我結果便是一個“回調”過程;我的手機號碼必須在以前告訴你,這便是註冊回調函數;我的手機號碼應該有效並且手機能夠接收到你的呼叫,這是回調函數必須符合接口規範。
如果你還不太清楚看看這段描述合和代碼:
聲明一個接口,另外一個類有方法裏面有個參數以是這個接口類型的,而後在另外類中實現這個接口(java中多用的是匿名內部類),而且以這個匿名的 類生成的對象爲參數傳到上面提到類中,而後實現回調.......這種用法可以參考java裏面常用到的數據庫操作所用到的幾個接口.....
下面是具體的例子:
public class SynCallback {
public static void main(String[] args) {
DealCallBack dcb = new DealCallBack();
final String name = "小朋友";
System.out.println(name+"遇到一個問題,打電話請教我...");
dcb.Call(name, new DealCallBack.CallBack() {
@Override
public void callBack() {
System.out.println(name + "已經得到了很滿意的答案.");
}
});
}
}
public class DealCallBack {
CallBack cb;
public void Call(String name, CallBack toWho) {
System.out.println(name + "問了我一個問題,我一時想不出,讓他先掛電話了,他可以繼續做其它事,等我想到了,回來再告訴他。");
this.cb = toWho;
deal(name); // 處理問題
}
public void deal(String name) {
System.out.println("我正在處理"+name+"的問題...");
result(name); // 得到答案
}
public void result(String name) {
System.out.println("我終於找到問題的答案了,馬上通知"+name);
cb.callBack(); // 回調,通知處理完了,這裏沒有參數,實際當中,callBack一般都是帶參數的,就是這邊處理的結果傳遞給另一邊
}
/*
* 定義好的接口
*/
public interface CallBack {
void callBack();
}
}