回調函數還真有點像您隨身帶的BP機:告訴別人號碼,在它有事情時Call您
回調用于層間協作,上層將本層函數安裝在下層,這個函數就是回調,而下層在一定條件下觸發回調,例如作為一個驅動,是一個底層,他在收到一個數據時,除了完成本層的處理工作外,還將進行回調,將這個數據交給上層應用層來做進一步處理,這在分層的數據通信中很普遍。
其
實回調和API非常接近,他們的共性都是跨層調用的函數。但區別是API是低層提供給高層的調用,一般這個函數對高層都是已知的;而回調正好相反,他是高
層提供給底層的調用,對于低層他是未知的,必須由高層進行安裝,這個安裝函數其實就是一個低層提供的API,安裝后低層不知道這個回調的名字,但它通過一
個函數指針來保存這個回調,在需要調用時,只需引用這個函數指針和相關的參數指針。
其實:回調就是該函數寫在高層,低層通過一個函數指針保存這個函數,在某個事件的觸發下,低層通過該函數指針調用高層那個函數。
關于回調的總結:
在Java中,通常就是編寫另外一個類或類庫的人規定一個接口,然后你來實現這個接口,然后把這個接口的一個對象作為參數傳給別人的程序,別人的程序必要時就會通過那個接口來調用你編寫的函數。
下面使用java回調函數來實現一個測試函數運行時間的工具類:
如果我們要測試一個類的方法的執行時間,通常我們會這樣做:
java 代碼
public class TestObject {
/**
* 一個用來被測試的方法,進行了一個比較耗時的循環
*/
public static void testMethod(){
for(int i=0; i<100000000; i++){
}
}
/**
* 一個簡單的測試方法執行時間的方法
*/
public void testTime(){
long begin = System.currentTimeMillis();//測試起始時間
testMethod();//測試方法
long end = System.currentTimeMillis();//測試結束時間
System.out.println("[use time]:" + (end - begin));//打印使用時間
}
public static void main(String[] args) {
TestObject test=new TestObject();
test.testTime();
}
}
大家看到了testTime()方法,就只有"http://測試方法"是需要改變的,下面我們來做一個函數實現相同功能但更靈活:
首先定一個回調接口:
java 代碼
public interface CallBack {
//執行回調操作的方法
void execute();
}
然后再寫一個工具類:
java 代碼
public class Tools {
/**
* 測試函數使用時間,通過定義CallBack接口的execute方法
* @param callBack
*/
public void testTime(CallBack callBack) {
long begin = System.currentTimeMillis();//測試起始時間
callBack.execute();///進行回調操作
long end = System.currentTimeMillis();//測試結束時間
System.out.println("[use time]:" + (end - begin));//打印使用時間
}
public static void main(String[] args) {
Tools tool = new Tools();
tool.testTime(new CallBack(){
//定義execute方法
public void execute(){
//這里可以加放一個或多個要測試運行時間的方法
TestObject.testMethod();
}
});
}
}
通過上面的文字和代碼我們可以理解了什么叫做java的回調。那么我們具體在什么時候使用回調函數呢?
在進行JDBC編程的時候,我們經常要寫到try catch語句塊,而如果采用回調技術,那么完全可以避免重復的去寫,將自己的方法體使用一個回調接口的方法來實現,每次都傳到同一個try catch當總,但是每一個方法的內容是不相同的。
再比如算法比較多的情況下,也可以采用這種實現模式來實現。最近看了SWT,發現里面好多的事件驅動都是采用回調來實現的。比如給按鈕添加事件:
Button okButton = createButton(buttons, "&Ok", "Process input",
new MySelectionAdapter(){
public void widgetSelected(SelectionEvent e)
{
System.out.println("Name: " + nameField.getText());
System.out.println("Address: " + addrField.getText());
System.out.println("Phone number: " + phoneField.getText());
}
});
匿名內部類最常用的情況就是在回調當中的精彩表現。
回調是一種雙向調用模式,也就是說,被調用方在接口被調用時也會調用對方的接口.
posted on 2010-11-03 10:57
無聲 閱讀(341)
評論(0) 編輯 收藏 所屬分類:
職場生活