摘要:很早之前不知道如何解釋清楚回調函數,在知乎上看到一個回答特別形象,當時就收藏了,所以今天決定用代碼的形式再讓這個回答更加深刻點。
很早之前不知道如何解釋清楚回調函數(CallBack),在知乎上看到一個回答特別形象,當時就收藏了,所以今天決定用代碼的形式再讓這個回答更加深刻點。
知乎-回調函數(callback)是什么?
然后再看看 Android 里的應用。
什么是回調函數
Android 里常見的回調
什么是回調函數維基的解釋:
在計算機程序設計中,回調函數,或簡稱回調(Callback 即call then back 被主函數調用運算后會返回主函數),是指通過函數參數傳遞到其它代碼的,某一塊可執行代碼的引用。這一設計允許了底層代碼調用在高層定義的子程序。
我認為通俗易懂的解釋:
你到一個商店買東西,剛好你要的東西沒有貨,于是你在店員那里留下了你的電話,過了幾天店里有貨了,店員就打了你的電話,然后你接到電話后就到店里去取了貨。在這個例子里,你的電話號碼就叫回調函數,你把電話留給店員就叫登記回調函數,店里后來有貨了叫做觸發了回調關聯的事件,店員給你打電話叫做調用回調函數,你到店里去取貨叫做響應回調事件。回答完畢。
可能看著通俗的解釋能夠知道是怎么回事,但是輪到自己要去實現一個回調的時候,就有點寸步難行了。所以我簡單將那個解釋,轉換成了代碼再解釋一番。
首先我得定義一個接口(我的電話號碼):
public interface INumber { public void onCall(); }
我去商店買東西,該商店對象剛剛初始化:
Store store = new Store();
然后我才得知商店剛剛開門沒有我要的貨(商店構造函數):
public class Store { public Store() { Utils.sout("才開店,沒有貨"); Utils.sout("============="); } }
所以我把我的電話號碼留給店員,對于店員來說就是得到我的電話號碼(注冊事件):
private INumber number; public void setNumber(INumber number) { this.number = number; } public void call() { number.onCall(); } /**************注冊前的準備工作完畢**************/ public static void main(String[] args) { Store store = new Store(); // 先注冊好事件 store.setNumber(new INumber() { @Override public void onCall() { Utils.sout("============="); Utils.sout("貨到了"); } }); for (int i = 1; i < 4; i++) { Utils.sout("模擬取貨:" + i + "小時"); } // 貨到了就打電話通知我 store.call(); }
整體控制臺輸出:
才開店,沒有貨
= = = = = = = = = = = = =
模擬取貨:1小時
模擬取貨:2小時
模擬取貨:3小時
= = = = = = = = = = = = =
貨到了
-
商店類的完整代碼:
public class Store { public Store() { Utils.sout("才開店,沒有貨"); Utils.sout("============="); } private INumber number; public void setNumber(INumber number) { this.number = number; } public void call() { number.onCall(); } public static void main(String[] args) { Store store = new Store(); store.setNumber(new INumber() { @Override public void onCall() { Utils.sout("============="); Utils.sout("貨到了"); } }); for (int i = 1; i < 4; i++) { Utils.sout("模擬取貨:" + i + "小時"); } store.call(); } }Android 里常見的回調
我們經常這樣寫:
btShowDialog = (Button) findViewById(R.id.bt_showdialog); btShowDialog.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // do something } });
我們經常可以看到這樣類似的代碼,監聽一個按鈕的點擊事件,當用戶點擊之后,我們執行一些邏輯。
這里的 setOnClickListener() 就跟我們之前店員獲得我的電話號碼的方法一樣 setNumber() 注冊好事件。
源碼:
/** * Register a callback to be invoked when this view is clicked. If this view is not * clickable, it becomes clickable. * * @param l The callback that will run * * @see #setClickable(boolean) */ public void setOnClickListener(@Nullable OnClickListener l) { if (!isClickable()) { setClickable(true); } getListenerInfo().mOnClickListener = l; } /** * Interface definition for a callback to be invoked when a view is clicked. */ public interface OnClickListener { /** * Called when a view has been clicked. * * @param v The view that was clicked. */ void onClick(View v); }
到這里的時候是不是就很清晰了呢?
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65058.html
摘要:緣起這是語言程序設計的,計劃之前全部整理完。產生隨機數的方法。復習題雙分支語句復習題嵌套的語句和多分支語句復習題常見錯誤和陷阱常見錯誤兩個浮點數值的相等測試復習題產生隨機數產生一個到之間的隨機值,不包括。 緣起 這是《Java語言程序設計(10th)》的Part1,計劃2017-12-31之前全部整理完。 2017-12-23開始想看這本書的,并同時開始實踐起Java來的。 Part...
摘要:兩種元素必須擁有相同的父元素,但是不必直接緊隨。臨時移動重定向未修改訪問緩存數據客戶端錯誤,請求包含語法錯誤或無法完成請求身份為認證服務器錯誤,服務器在處理請求的過程中發生了錯誤服務器內部錯誤持續更新 對平常的小知識點,會持續更新 == 對比 特殊原則 undefined == null / null == undefined number 和 string/boolean 對比將...
摘要:排序算法和集合工具類排序算法和集合工具類。面試官總是問排序算法也不是在難為你,而是在考察你的編程功底。你首先要理解多線程不僅僅是和那么簡單,整個并發包下面的工具都是在為多線程服務。 去年的這個時候樓主通過兩個月的復習拿到了阿里巴巴的 offer,有一些運氣,也有一些心得,借著跳槽季來臨特此分享出來。簡單梳理一下我的復習思路,同時也希望和大家一起交流討論,一起學習,如果不對之處歡迎指正一...
摘要:相對于電子書,我更喜歡紙質版的書籍。過去的年一共閱讀過本技術書,下面對這些書做一個小結。源碼深度解析這本書是年購買的,年是第四次閱讀。必知必會數據庫的復習書籍,內容淺顯易懂。 相對于電子書,我更喜歡紙質版的書籍。我喜歡在拿到新書時記錄購買時間、地點、開始閱讀的時間、第一次看完的時間,算是一種學習的記錄。過去的2016年一共閱讀過15本技術書,下面對這些書做一個小結。 《深入理解Java...
摘要:寫這篇總結,主要是記錄下自己的學習經歷,算是自己對知識的一個回顧。這個階段學習的時候,要學會使用開發工具,比如或者來學習。這個階段需要自己對自己有很強的自律去學習,不要看了一半就放棄了。 showImg(https://segmentfault.com/img/bVbaNtw?w=1232&h=822); 寫這篇總結,主要是記錄下自己的學習經歷,算是自己對知識的一個回顧。也給想要學習 ...
閱讀 2983·2021-11-23 09:51
閱讀 2997·2021-11-02 14:46
閱讀 862·2021-11-02 14:45
閱讀 2738·2021-09-23 11:57
閱讀 2492·2021-09-23 11:22
閱讀 1923·2019-08-29 16:29
閱讀 740·2019-08-29 16:16
閱讀 937·2019-08-26 13:44