標籤:
做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進行處理 });
Java介面回調實現按鈕監聽