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