編輯:關於Android編程
所謂回調,就是客戶程序Client調用服務程序Service中的某個方法A,然後Service又在某個時候反過來調用Client中的某個方法B,對於Client來說,這個B便叫做回調函數。
Java的回調是通過接口或者內部類來實現的。
JAVA方法回調是功能定義和功能實現分享的一種手段,是一種耦合設計思想。作為一種架構,必須有自己的運行環境,並且提供用戶的實現接口。
這裡就上面的講解寫一個最簡單的例子:
第一步:因為方法的回調是通過接口來實現的所以要定義一個接口(我們稱它為回調接口)
/** * 定義一個回調接口,包含一個回調函數 * @author Administrator */ public interface CallBack { /** * 這就是Service回調Client的方法 * @param result 回調時攜帶的參數(可選) */ public void B(String result); }
/** * 這個Client類, 實現CallBack接口(條件一) * @author Administrator * */ public class Client implements CallBack{ /** * Client類 包含 Service類 的引用 (條件二) 因為Client要調用Service中的方法 */ Service service = new Service();//可直接實例化或在構造函數或某個方法中進行實例化 /** * 該方法用於請求Service調用Service中的方法 */ public void requrst(){ System.out.println("請求服務器調用服務器的方法"); service.A(this);//傳入當前對象也就是CallBack對象,因為Client實現類CallBack接口 } /** * Service回調Client的實現方法 */ @Override public void B(String result) { // TODO Auto-generated method stub System.out.println("服務器回調我的方法返回的結果是:"+result); } }
public class Service { CallBack callback;//定義接口類型對象,要調用接口中的回調方法 String result = "謝謝你的請求"; public void sendManage(Client client) { this.callback = client; callback.B(result);//調用的是該接口的實現方法(即Client中的B) } }
public class Test { public static void main(String[] args) { Client client = new Client(); client.requrst(); } }
輸出結果:
請求服務器調用服務器的方法
服務器回調我的方法返回的結果是:謝謝你的請求
以上就是一個簡單實現接口回調的機制,我們總結一下實現的所需的步驟:
1、定義回調接口和回調方法
2、Client實現回調接口和回調方法,並在Client中包含Service引用,通過引用調用Servie中的方法並且必須傳入一個當前對象Client(因為當前對象實現了CallBack接口所以也屬於接口對象)
3、在Service中定義一個接口對象並在方法中對初始化(將Client傳過來的當前對象賦值給接口對象),通過接口對象調用接口中方法(調用的Client實現的接口方法)
4、測試
以下一個比較綜合的例子使用到了“異步+回調”
比如生活中的實例,某天,我打電話向你請教問題,當然是個難題,^_^,你一時想不出解決方法,我又不能拿著電話在那裡傻等,於是我們約定:等你想出辦法後打手機通知我,這樣,我就掛掉電話辦其它事情去了。過了XX分鐘,我的手機響了,你興高采烈的說問題已經搞定,應該如此這般處理。
故事到此結束。這個例子說明了“異步+回調”的編程模式。其中,你後來打手機告訴我結果便是一個“回調”過程,結果(即處理方法)就是一個回調函數。
我的手機號碼必須在以前告訴你,即告訴你通過何種方式可以找到我,這便是注冊回調函數;我的手機號碼應該有效並且手機能夠接收到你的呼叫,這是回調函數必須符合接口規范。
案例實現接口回調的步驟:
1.定義一個回調接口包含回調方法(這是接口約定,有答案時電話聯系)
2.我(Me.java)這個類實現回調接口和提供回調方法的實現,並向你注冊回調(因為只有向你注冊了回調你才能回調我的方法告訴我答案)
3.你(You.java)這個類提供了接收問題並回答(回答就是我向你注冊的回調參數類型為接口對象)的方法
4.測試類
/** * 定義一個回調接口,包含一個回調函數 * @author Administrator */ public interface CallBack { /** * 當你知道答案可以調用該回調函數告訴我答案 * @param result 答案 */ public void solve(String result); }
/** * 這個類代表我,因為你要告訴我答案所以要實現CallBack回調接口和接口中的回調方法的實現 * 我要向你提問所以有一個提問的方法askQqstion(),在提問的同時要向對方(你)注冊回調接口,當你知道答案的時候調用我裡面的接口實現方法,最後得到答案 * @author Administrator * */ public class Me implements CallBack{ /** * 我(Me)這裡包含一個對你(You)的引用 * 因為我(Me)要調用你(You)裡面的方法向你詢問(問題的描述)和注冊回調(用於你告訴我答案) */ private You you; public Me(You you){ this.you = you; //實例化引用 } /** * 我通過這個方法向你進行提問,在提問時進行回調注冊,讓你在知道答案是可以告訴我 * @param question 問題的描述 */ public void askQqstion(final String question){ //異步 new Thread(new Runnable() { @Override public void run() { /** * 我調用你的方法,在這裡向你注冊回調接口 */ you.executeMessage(Me.this, question); } }).start(); } // 我問完問題後就掛掉電話,讓你去思考問題的答案同時我也可以去做別的事 public void play(){ System.out.println("我去完了"); } /** *當你知道答案後調用此方法告訴我,就是所謂的回調方法 */ @Override public void solve(String result) { System.out.println("你告訴我的答案是--->"+result); } }
public class You { /** * 接收我的問題和基友回答問題的 * @param callBack 接口回調對象,通過該對象可以調用實現了該接口的對象(Me)中的接口實現方法(Me中的solve()方法) * @param question 問題描述 */ public void executeMessage(CallBack callBack, String question){ //模擬你要思考很長時間 for(int i=0;i<10000;i++){ } /** * 想到了答案 */ String result = "答案就是我也不知道"; /** * 想到後你就打電話告訴我,放過來調用我這個類中的回調方法 */ callBack.solve(result); } }
/** * 測試類 * @author Administrator * */ public class Test { public static void main(String[] args) { //兩個對象一個我一個你 You you = new You(); Me me = new Me(you); //我向你提問 me.askQqstion("世界到底有多大?"); } }
輸出結果:
你告訴我的答案是—>答案就是我也不知道
1.回調函數也是一個函數或過程,不過它是一個由調用方自己實現,供被調用方使用的特殊函數。
2.即調用方A不直接使用此函數function,而是通過調用被調用方B來間接調用function。
通過上面的那個例子你是不是差不多明白了回調機制呢,上面是一個異步回調,就是我去做我的事但是我還是在等你的答案,相應的也有同步回調。線程run()也是一個回調方法,當執行Thread的start()方法就會回調這個run()方法,還有處理消息都比較經典等等
比較笨的一種認識:Android中以on開頭的方法都是回調方法:onCreate (),onStart (),onPause (),onStop()等等。
在Activity中定義了很多生命周期的不同狀態要調用的方法,這些方法都是空實現,系統框架要調用,用戶也要調用來實現。
1.以上可以看出,接口(系統框架)是系統提供的,接口的實現是用戶實現的,這樣可以達到接口統一,實現不同的效果。
2.系統在不同的狀態“回調”我們的實現類,來達到接口和實現的分類。
Android提供了兩種事件處理的方式:基於回調的事件處理 和 基於監聽的事件處理。 我們來說的容易理解一點:(1)基於回調的事件處理就是繼承GUI組件,並重寫
對現有控件進行擴展1、繪制如下所示的兩層背景的TextView創建BorderTextView繼承TextView在構造函數中初始化一些基本數據 //外邊框 mPa
1、支持幾乎所有安卓版本,從安卓2.x~7.0安卓4.4、4.4.1和4.4.2是無法支持的,因為當時Google說WebView上傳文件不安全,就去掉了。所以這3個版本
效果: http://www.56.com/u82/v_OTM4MDk5MTk.html第一步: 創建anim文件夾放置動畫xml文件在res文件夾下,創建一個