做Android開發的時候,經常碰到View的事件監聽,雖然一直在用,但從未思考它的實現原理。還有回調函數雖然經常聽說,但是總感覺很暈,一想腦袋就開始亂了。所以今天就寫點東西來理一下思路。
回調函數
以下是維基百科上的定義:
在計算機程序設計中,回調函數,或簡稱回調(Callback 即call then back 被主函數調用運算后會返回主函數),是指通過函數參數傳遞到其它代碼的,某一塊可執行代碼的引用。這一設計允許了底層代碼調用在高層定義的子程序。
光看定義可能晦澀難懂,下面還是回到標題,用Java接口回調實現按鈕監聽。
Java接口回調
我這里的代碼基本就仿照Android的按鈕監聽方式。
首先定義一個接口,里面定義回調函數onClick。
public interface OnClickListener { void onClick(Button b);}然后我們來實現Button類。
public class Button { PRivate OnClickListener listener; public void setOnClickListener(OnClickListener listener){ this.listener=listener; } public void printSomeThing(String msg){ System.out.println(msg); } public void click() { listener.onClick(this); }}最后在main函數中調用。
public class CallBackTest { public static void main(String[] args) { Button button=new Button(); button.setOnClickListener(new OnClickListener() { @Override public void onClick(Button b) { b.printSomeThing("按鈕被點擊"); } }); System.out.println("開始模擬點擊"); System.out.println("真正的點擊應該由系統來調用"); button.click(); }}大概過程就是button.click()調用回調函數OnClickListener.onClick,但是這個onClick的實現是在button.setOnClickListener里面的匿名內部類實現的。語言還是表達不太清楚,所以還是多看代碼吧。
JS中的回調函數
順便提一下JS中的回調函數吧。因為JS的函數也是對象,可以直接作為參數傳遞,所以實現起來很簡單。
//模擬服務器返回數據 var getInfo=function(id,callback){ var result="<div>Something get By"+id+"</div>"; setTimeout(function(){ callback(result); },1000);//定時1秒返回數據 }; //調用 getInfo(id,function(result){ //對返回的result進行處理 });新聞熱點
疑難解答