回撥(callback)機制
阿新 • • 發佈:2019-02-20
一. 前言
回撥(callBack)是使用頻率非常高的一種程式設計技巧,它是2個物件間通訊的一個手段.曾經看到知乎上一個比較淺顯易懂的說法:
你到一個商店買東西,剛好你要的東西沒有貨,於是你在店員那裡留下了你的電話,過了幾天店裡有貨了,店員就打了你的電話,然後你接到電話後就到店裡去取了貨。在這個例子裡,你的電話號碼就叫回調函式,你把電話留給店員就叫登記回撥函式,店裡後來有貨了叫做觸發了回撥關聯的事件,店員給你打電話叫做呼叫回撥函式,你到店裡去取貨叫做響應回撥事件。回答完畢。 (連結:https://www.zhihu.com/question/19801131)
二. 分析問題
現在寫個小程式來實踐下.分析下這個問題,可以看到:物件:PersonA(店員), PersonB(我)
分別擁有啥和幹了啥: PersonB(我): 有一個作為回撥函式的號碼,一個註冊函式.
PersonA(店員): 等待貨物的到來,貨物來了回調回調函式.
三. 解決問題
這裡我們用,回撥介面來實現回撥函式,以它來作為二者的橋樑。用java語言,在android studio 上實現,首先寫一個介面類CallBack.java,其內容為:package com.example.test;public interface CallBack { void onCallBack(); }
然後,我們實現PersonB.java類.其主要任務為2個,其一,定義和new一個回撥函式物件,其二,把這個物件註冊到PersonA當中去.
package com.example.test;public class PersonB { private String name; public MCallBack mCallBack; private boolean haveGoods = true; public PersonB(String str){ name = str;mCallBack = new MCallBack(); }public class MCallBack implements CallBack{ @Override public void onCallBack() { System.out.println("PersonA: PersonB,Your goods has arrived! "); } }public void testCallBack(){ System.out.println("PersonB: PersonA, Call me if you have goods!"); new PersonA("PersonA").notifyIfGoodsArrived(haveGoods,mCallBack); } }
接下來實現PersonA.java為,其主要任務也為2個,其一為完成PersonB交代的任務(這裡開啟一個執行緒睡3s來模擬這個任務), 其二,完成任務後,通過收到的回撥介面(來之PersonB)通知PersonB:
package com.example.test;public class PersonA { public String name; public PersonA(String str){ name = str; } public void notifyIfGoodsArrived(final boolean haveGoods, final CallBack mCallBack){ if (haveGoods){ //start the task to wait for the goods. new Thread(){ @Override public void run() { try{ //Suppose the goods come after 3 seconds. sleep(3000); } catch(InterruptedException e){ e.printStackTrace(); } mCallBack.onCallBack(); } }.start(); } } }
最後編寫一個測試類MyClass.java
package com.example.test;public class myClass { public static void main(String[] args){ new PersonB("PersonB").testCallBack(); } }
測試結果:
PersonB: PersonA, Call me if you have goods! PersonA: PersonB,Your goods has arrived! Process finished with exit code 0
四. 結論
結果基本的實現了我們的目標, 注意不要用PersonB 來implement CallBack, 因為傳一個介面把自己完全暴露給PersonA, 隱私都沒了.這樣可能會導致資料不安全.