編輯:關於Android編程
以前對於這個機制理解不夠深刻,現在重新整理下思路。
一、建模
我理解的接口回調就是,我這個類實現了一個接口裡的方法doSomething,然後注冊到你這裡,然後我就去做別的事情去了,你在某個觸發的時機回頭來調用我doSomething的方法。好比,我給你打電話問某個難題,你電話裡想不出來,於是說等想到了再回我電話。於是接口回調機制比喻模型如下
第一步:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ytfPyKOsxOPO0rXD1Ly2qKOs1eK49sq1z9a1xLe9t6jKx9Wm0fm1xKOsvdDKssO0w/vX1qOs0OjSqrSryOu0q7P2yrLDtKGjzqrKssO00qrV4tH5xNijv8TjztK1w9S8tqi157uwwarPtaOssrvKx86i0MW/27/boaPV4r7NysfUvLaotcS907/aoaM8L3A+CjxwPs7Sw8fUvLaotbHE48/rtb3OyszitcS08LC4vs272M7So6zL+dLU1eLA77SryOuyzsr9ysfE48/rtb21xLTwsLihozwvcD4KPHA+IDwvcD4KPHByZSBjbGFzcz0="brush:java;">public interface ContactInterface {
public void callBackByTel(String answer);
}
第二步:
我得先打電話(注冊)到你那,告訴你我的問題是什麼。是吧。
所以你那裡必須有個方法讓我告訴你問題相關事宜(注冊)。
public void setCallBack(String who,String question,ContactInterface callBack) { this.who = who; System.out.println("你說:當前聯系到我的人是"+who+",問題是"+question); this.callBack =callBack; }
第三步:
當你想到問題的答案後,打電話告訴我答案,即回調我傳進來的方法。
public void handleThings(){ //假如你現在正在想問題的答案,需要一點時間 for(int i=0;i<100000;i++){ if(i == 0){ System.out.println("你正在思考問題....."); } } String answer = "答案是A"; //想到問題的辦法了 System.out.println("你說:想到答案了,准備打回去給"+who+"告訴他答案"); callBack.callBackByTel(answer); }
OK, 整個機制構成三要素就是:我(客戶端),你(服務端),約定(接口)
我類——
public class Me { public static void main(String[] args){ Me me = new Me(); me.hasQuestion(); } private void hasQuestion(){ //現在有問題想不出來答案,想去問你 You you = new You(); you.setCallBack("蝸牛", "某道題答案是什麼?", new ContactInterface() { @Override public void callBackByTel(String answer) { System.out.println("我說:嗯,好的,我收到答案了:"+answer+",謝謝"); } }); //你接到電話,起床開始思考問題 new Thread(you).start(); } }
package lin.callback.test; public class You implements Runnable{ private String who; private ContactInterface callBack; public You() { // TODO Auto-generated constructor stub } //調用此方法就表示有人聯系你了,注冊到你這來 public void setCallBack(String who,String question,ContactInterface callBack) { this.who = who; System.out.println("你說:當前聯系到我的人是"+who+",問題是"+question); this.callBack =callBack; } public void handleThings(){ //假如你現在正在想問題的答案,需要一點時間 for(int i=0;i<100000;i++){ if(i == 0){ System.out.println("你正在思考問題....."); } } String answer = "答案是A"; //想到問題的辦法了 System.out.println("你說:想到答案了,准備打回去給"+who+"告訴他答案"); callBack.callBackByTel(answer); } /* (non-Javadoc) * @see java.lang.Runnable#run() */ @Override public void run() { try { Thread.sleep(1000); handleThings(); } catch (Exception e) { e.printStackTrace(); } } }
public interface ContactInterface { public void callBackByTel(String answer); }
驗證結果:
二、總結
Java 中沒有函數指針這一說,因為java沒有指針,但是並不代表著它不會使用這個功能。事實上,引用就是實現了指針的功能。
回調方法就是一個通過方法指針來調用的方法。如果我將這個方法的指針(地址,引用)通過形參傳遞到另一個類的某個方法裡,那麼當這個類調用該方法裡面我所傳入的指針時,就能調用我這邊的方法。
整個過程就是我傳入方法A的地址,你接收,並在某個時刻回調我這邊的A方法。
由於java沒辦法操作指針,於是它用接口來實現。
JAVA方法回調是一種耦合設計思想。作為一種架構,必須有自己的運行環境,並且提供用戶的實現接口。
主要步驟如下:
這樣,在需要的時候,可用Caller對象的mCallback接口成員調用callback()方法,完成回調了。
三、Android中的回調機制
在android 中回調機制被大量使用。
比如,在Activity中定義了很多生命周期的不同狀態要調用的方法,這些方法都是空實現,系統框架要調用,用戶也要調用來實現。或者更直接的是按鍵點擊的實現方法。
loginButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub } });
明顯,OnClickListener就是android 系統所約定好的接口,然後我們寫的應用程序就是客戶端,android 系統就是服務端。模型關系如下圖所示:
以上可以看出,接口(系統框架)是系統提供的,接口的實現是用戶實現的,這樣可以達到接口統一,實現不同的效果。
系統在不同的狀態“回調”我們的實現類,來達到接口和實現的分類。
Android中的事件Touch事件,四種狀態: ACTION_DOWN ——> 表示按下了屏幕,一個事件必然從ACTION_DOWN開始
本文來自http://blog.csdn.net/hellogv/ ,引用必須注明出處! 上次講了Android手機與BLE終端之間的通信,而最常見的BLE終端應該是蘋果
Context的方法getCacheDirgetFilesDirgetExternalCacheDirgetExternalFilesDir特點1:無需權限將assets
項目地址:https://github.com/JeasonWong/JikeGallery話不多說,先上效果。這個效果是在即刻app上看到,覺得很不錯,遂仿之。先說下我