當時我思考了下就讓他在非同步完成後回撥一下將值返回……因為對方是初學者我就給他簡單解釋了下Android的回撥……說了一下午他都沒弄明白……原因不是我講得不夠詳細而是他陷進了他非同步的問題……他把他那個問題和我講的回撥混在了一起……一直跳不出那個思維,其實回撥機制很好理解,也基於這個原因,也算為了這位仁兄,我決定用最直白的語言來給大家講講Android的回撥機制是怎麼個回事,閱讀這篇文章你不需要太高深的技術功底,只要你會點JAVA基本的知識,知道什麼叫類什麼叫介面怎麼建立專案,我想相信你看完本章後必定會有收穫。
廢話不多說,像許多網上介紹回撥機制的文章一樣,我這裡也以一個現實的例子開頭:假設你公司的總經理出差前需要你幫他辦件事情,這件事情你需要花些時間去做,這時候總經理肯定不能守著你做完再出差吧,於是就他告訴你他的手機號碼叫你如果事情辦完了你就打電話告訴他一聲;這是一個現實生活中常能碰到的例子,我們用呢就用程式碼的方式來實現一個這個過程,看一下這個過程究竟是怎樣的。
首先在Eclipse中新建一個Java專案:CallBackDemoInJava;
然後再新建三個類:Manager(該類用來模擬總經理)、Personnel(該類用來模擬員工)、Main(主類);
Manager的程式碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
package com.aige.test; /** * @description 該類用來模擬總經理 * @author Aige * <a href="http://www.jobbole.com/members/chchxinxinjun">@since</a> 2014/11/6 */ public class Manager { /** * @param personnel * 傳入一個員工類的物件 */ public Manager(Personnel personnel) { // 想讓該讓員工做什麼 personnel.doSomething(this, "整理公司檔案"); } /** * @description 當員工做完總經理讓他做的事後就通過該方法通知總經理 * @param result * 事情結果 */ public void phoneCall(String result) { System.out.println("事情" + result); } } |
Manager類是個模擬總經理的類,當該類的物件被造出來後就會通過Personnel的物件去執行Personnel中的doSomething方法告訴員工做些什麼
Personnel的程式碼如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package com.aige.test; /** * @description 該類用來模擬員工 * @author Aige * <a href="http://www.jobbole.com/members/chchxinxinjun">@since</a> 2014/11/6 */ public class Personnel { public void doSomething(Manager manager, String task) { // 總經理通過doSomething方法告訴員工要做什麼 System.out.println("總經理要你做" + task); String result = "做完了"; // 當事情做完了我們就通過總經理公佈的phoneCall方法通知總經理結果 manager.phoneCall(result); } } |
總經理通過呼叫Personnel中的doSomething方法告訴員工該做些什麼,當員工做完後就通過Manager中的phoneCall方法通知總經理結果。
那麼好的!萬事俱備,我們在Main中測試執行下程式碼看看結果:
1 2 3 4 5 6 7 8 9 10 11 |
package com.aige.test; public class Main { public static void main(String[] args) { // 首先我們需要一個員工 Personnel personnel = new Personnel(); // 其次把這個員工指派給總經理 new Manager(personnel); } } |
程式碼執行結果如下:
回到我們剛才舉的那個現實中的例子:總經理出差前要你去辦件事情,這件事情通過doSomething告訴你了,事情要是辦完了就打總經理的電話phoneCall通知他一聲。這裡的phoneCall我們就稱為回撥方法,為什麼稱之為回撥呢?你問我我也不清楚哈~這你得問Sun公司了,不過我們從程式碼的執行過程可以看出資料的流向大致是Manager—–>Personnel—–>Manager,這不就是一個“回撥”的過程麼?現在我們來總結下滿足回撥的兩個基本條件:
1.Class A呼叫Class B中的X方法
2.ClassB中X方法執行的過程中呼叫Class A中的Y方法完成回撥
一切看上去都很完美~以上例子程式碼簡單通俗地描述了回撥,但是這裡我就會有這樣一個疑問:假設總經理出差前交了件事情給我去辦,不巧……副總經理也要給我件事去辦,更無恥的是……主管也發任務過來了,都要求說做完就打電話通知他們……這時我們就要定義更多類,什麼總經理類啦~經理類啦~主管類啦~雜七雜八的類,但是這些雜七雜八的大爺們都要求做完事情就電話通知,每個類都會有一個類似phoneCall的方法作為回撥方法,這時,我們利用物件導向的思想來看~是不是可以把這個回撥方法抽象出來作為一個獨立的抽象類或介面呢?多型的思想油然而生~~~鑑於JAVA介面的好處,我們就定義一個名為CallBack的介面作為回撥介面,再在該介面下定義一個名為backResult的抽象方法作為回撥方法,讓那些總經理類啦~經理類啦~主管類啦~什麼的都去實現該介面,這時候我們就來改造下我們的專案:
CallBack程式碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
package com.aige.test; /** * @description 回撥介面 * @author Aige * <a href="http://www.jobbole.com/members/chchxinxinjun">@since</a> 2014/11/6 */ public interface CallBack { // 回撥方法 public void backResult(String result); } |
Manager程式碼改造後如下:
實現CallBack介面重寫backResult方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
/** * @description 該類用來模擬總經理 * @author Aige * <a href="http://www.jobbole.com/members/chchxinxinjun">@since</a> 2014/11/6 */ public class Manager implements CallBack { /** * @param personnel * 傳入一個員工類的物件 */ public Manager(Personnel personnel) { // 想讓該讓員工做什麼 personnel.doSomething(this, "整理公司檔案"); } /** * @description 當員工做完總經理讓他做的事後就通過該方法通知總經理 * @param result * 事情結果 */ public void backResult(String result) { System.out.println("事情" + result); } } |
Personnel程式碼改造後如下:
doSomething方法不再傳入一個Manager物件而是一個CallBack介面:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package com.aige.test; /** * @description 該類用來模擬員工 * @author Aige * <a href="http://www.jobbole.com/members/chchxinxinjun">@since</a> 2014/11/6 */ public class Personnel { public void doSomething(CallBack callBack, String task) { // 總經理通過doSomething方法告訴員工要做什麼 System.out.println("總經理要你做" + task); String result = "做完了"; // 當事情做完了我們就通過總經理公佈的phoneCall方法通知總經理結果 callBack.backResult(result); } } |
Main程式碼不變,執行結果也是一樣的。
至此,回撥的基本概念差不多就是這樣了~其實回撥真心不難理解,但是回撥在Android中相當重要,幾乎處處可見回撥機制,如果你能理解到回撥的奧祕~我相信對你的Android技術是一個不小的提升~~吃藥去了!