深入理解Android之接口回調(diào)機制
剛開始學對于這個機制理解不夠深刻,現(xiàn)在重新整理下思路。開發(fā)中,接口回調(diào)是我們經(jīng)常用到的。
接口回調(diào)的意思即,注冊之后并不立馬執(zhí)行,而在某個時機觸發(fā)執(zhí)行。
首先解決啥是回調(diào):
舉個例子:某天,我打電話向你請教問題,當然是個難題,你一時想不出解決方法,我又不能拿著電話在那里傻等,于是我們約定:等你想出辦法后打手機通知我,這樣,我就掛掉電話辦其它事情去了。過了XX分鐘,我的手機響了,你興高采烈的說問題已經(jīng)搞定,應(yīng)該如此這般處理。

C不會自己調(diào)用b,C提供b的目的就是讓S來調(diào)用它,而且C不得不提供。S并不知道C提供的b是什么,因此S會約定b的接口規(guī)范(函數(shù)原型),然后由C提前通過S的一個函數(shù)r告訴S自己將要使用b函數(shù)(即注冊)。r為注冊函數(shù)。
簡單來說:回調(diào)函數(shù)就是預(yù)留給系統(tǒng)調(diào)用的函數(shù),而且我們往往知道該函數(shù)被調(diào)用的時機,那我們繼續(xù)完善下上面的那幅圖。

看著這幅圖,其實我們回想一下,會發(fā)現(xiàn),生活中到處都有回調(diào)這種思想存在。軟件的很多思想其實只是我們實際生活中思維方式的一種轉(zhuǎn)化。
我們平時考試答題的第一件事是干嘛?沒錯,是寫上學號和姓名。這里注意了,我們填寫學號和姓名不是給自己看的(即該方法不是給自己調(diào)用的),而是給老師登記分數(shù)時看的(預(yù)留給系統(tǒng)將來調(diào)用),這其實就是一個回調(diào)的應(yīng)用。老師提供接口(輸入姓名,學號規(guī)則),我們利用接口注冊。
看到上面的小示例,大家對回調(diào)就有了一些了解了,我們再回到文章剛開始的例子。
那個例子說明了“異步+回調(diào)”的編程模式。其中,你后來打手機告訴我結(jié)果便是一個“回調(diào)”過程;我的手機號碼必須在以前告訴你,這便是注冊回調(diào)函數(shù);我的手機號碼應(yīng)該有效并且手機能夠接收到你的呼叫,這是回調(diào)函數(shù)必須符合接口規(guī)范。
我們已經(jīng)大概知道了回調(diào)的基本流程,下面,來看看Android中回調(diào)的基本使用。
場景一:
Button button = (Button)this.findViewById(R.id.button);
button.setOnClickListener(newButton.OnClickListener() {
//回調(diào)函數(shù)
@override
publicvoidonClick(View v) {
buttonTextView.setText("按鈕被點擊了");
}
});
上面的代碼給按鈕加了一個事件監(jiān)聽器,這其實就是“回調(diào)”最常見的應(yīng)用場景之一。我們自己不會顯式地去調(diào)用onClick方法。用戶觸發(fā)了該按鈕的點擊事件后,它會由Android系統(tǒng)來自動調(diào)用。
場景二:
@Override
publicvoidonCreate(BundlesaveInstanceState) {
super.onCreate(saveInstanceState);
// You code...
}
@Override
publicvoidonResume() {
super.onResume();
// You code...
}
Activity的整個生命周期基本上都說回調(diào)函數(shù)在發(fā)揮作用。
看了兩個我們經(jīng)常使用的回調(diào)方式,我們先來總結(jié)下android利用回調(diào)的基本方法。其實,只是把我們的那張圖翻譯了下。
--你類--
package lin.callback.test;
public class You implements Runnable{
private String who;
private ContactInterface callBack;
public You() {
// TODO Auto-generated constructor stub
}
//調(diào)用此方法就表示有人聯(lián)系你了,注冊到你這來
public void setCallBack(String who,String question,ContactInterface callBack) {
this.who = who;
System.out.println("你說:當前聯(lián)系到我的人是"+who+",問題是"+question);
this.callBack =callBack;
}
public void handleThings(){
//假如你現(xiàn)在正在想問題的答案,需要一點時間
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 class Me {
public static void main(String[] args){
Me me = new Me();
me.hasQuestion();
}
private void hasQuestion(){
//現(xiàn)在有問題想不出來答案,想去問你
You you = new You();
you.setCallBack("蝸牛", "某道題答案是什么?", new ContactInterface() {
@Override
public void callBackByTel(String answer) {
System.out.println("我說:嗯,好的,我收到答案了:"+answer+",謝謝");
}
});
//你接到電話,起床開始思考問題
new Thread(you).start();
}
}
--接口類(規(guī)范)--
public interface ContactInterface {
public void callBackByTel(String answer);
}
驗證結(jié)果:
你說:當前聯(lián)系到我的人是蝸牛,問題是某道題答案是什么?
你正在思考問題
你說:想到問題了,準備打回去給蝸牛告訴他答案
我說:嗯,好的,我收到答案了:答案是A,謝謝
對回調(diào)的深入思考:
程序的本質(zhì)就是代碼跳轉(zhuǎn),不管同步異步反射接口虛函數(shù),本質(zhì)上都是函數(shù)調(diào)用。函數(shù)我們要調(diào)用它,就需要它的指針,不同語言通過不同的方式來得到這個指針。而我們定義的接口其實就是一個函數(shù)指針,那么那個注冊過程,其實就是相當于對那個函數(shù)指針賦值。通過這個函數(shù)指針來調(diào)用我們定義的自實現(xiàn)函數(shù)。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android使用百度地圖出現(xiàn)閃退及定位時顯示藍屏問題的解決方法
這篇文章主要介紹了Android使用百度地圖出現(xiàn)閃退及定位時顯示藍屏問題的解決方法,需要的朋友可以參考下2018-01-01
Android編程實現(xiàn)ListView中item部分區(qū)域添加點擊事件功能
這篇文章主要介紹了Android編程實現(xiàn)ListView中item部分區(qū)域添加點擊事件功能,涉及Android ListView相關(guān)適配器及事件響應(yīng)操作技巧,需要的朋友可以參考下2018-01-01
Android App數(shù)據(jù)格式Json解析方法和常見問題
JSON數(shù)據(jù)格式,在Android中被廣泛運用于客戶端和網(wǎng)絡(luò)(或者說服務(wù)器)通信,非常有必要系統(tǒng)的了解學習。恰逢本人最近對json做了一個簡單的學習,特此總結(jié)一下,以饗各位2014-03-03
Android ContentProvider實現(xiàn)獲取手機聯(lián)系人功能
這篇文章主要為大家詳細介紹了Android ContentProvider實現(xiàn)獲取手機聯(lián)系人功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07
Android編程實現(xiàn)調(diào)用系統(tǒng)圖庫與裁剪圖片功能
這篇文章主要介紹了Android編程實現(xiàn)調(diào)用系統(tǒng)圖庫與裁剪圖片功能,結(jié)合實例形式分析了Android針對圖形的旋轉(zhuǎn)與剪切等具體操作技巧,需要的朋友可以參考下2017-01-01
Android中TextView和ImageView實現(xiàn)傾斜效果
這篇文章主要為大家詳細介紹了Android中TextView和ImageView實現(xiàn)傾斜效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08

