最近對Android中的回調(diào)產(chǎn)生了一些疑問蛇更,看了不少博文才算是明白了一點,接下來分享一下我的收獲座慰。
寫在正文之前陨舱,大神可以跳過:
1.接口不可以實例化,但可以創(chuàng)建一個接口對象版仔。*注1:
2.你可能見過這樣的語法:
Button bt_add = (Button) findViewById(R.id.bt_add);
bt_add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
}
});
我們都知道OnClickListener()是一個接口游盲,但是上文中 new OnClickListener()并非是實例化接口,而是表示一個匿名內(nèi)部類實現(xiàn)該接口蛮粮。
*注1:“創(chuàng)建一個接口對象”這樣的描述并不合適益缎,在閱讀《thinking in java》的過程中,我找到了一個更合適的詞——引用(reference)然想。當然如果你有更好的看法可以在評論中指出莺奔,我們一起來討論。
1.回調(diào)函數(shù)定義
回調(diào)函數(shù)就是一個通過函數(shù)指針調(diào)用的函數(shù)变泄。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù)令哟,當這個指針被用來調(diào)用其所指向的函數(shù)時恼琼,我們就說這是回調(diào)函數(shù)∑粮唬回調(diào)函數(shù)不是由該函數(shù)的實現(xiàn)方直接調(diào)用晴竞,而是在特定的事件或條件發(fā)生時由另外的一方調(diào)用的,用于對該事件或條件進行響應(yīng)狠半。
當然噩死,看了這么正式的定義,其實對我來說并沒有多大的幫助神年,畢竟對指針直接接觸比較少已维,對于這個定義也沒有多深的感受。還是直接看回調(diào)機制吧已日!
2.回調(diào)機制
⑴定義一個回調(diào)函數(shù)垛耳;
⑵提供函數(shù)實現(xiàn)的一方在初始化的時候,將回調(diào)函數(shù)的函數(shù)指針注冊給調(diào)用者捂敌;
⑶當特定的事件或條件發(fā)生的時候艾扮,調(diào)用者使用函數(shù)指針調(diào)用回調(diào)函數(shù)對事件進行處理。
對于百度百科上的這個說法占婉,有一股撲面而來的熟悉感泡嘴,就算是“函數(shù)指針”這么個陌生的名詞都擋不住。這不就是上文代碼嗎逆济?onClick()方法就是回調(diào)方法酌予,在Button被點擊這個事件發(fā)生時,我們使用onClick()回調(diào)方法對事件進行處理奖慌。不同的時我們不能提供指針抛虫,而是提供了一個接口。事實上在java中正是通過接口來實現(xiàn)回調(diào)方法简僧。
3.模擬自定義控件實現(xiàn)回調(diào)方法
網(wǎng)上很多用打電話的例子來說明建椰,而我最近剛看了一點自定義控件,有點感覺岛马,就用控件來說明棉姐。
假設(shè)我現(xiàn)在自定義了一個繼承于View的開關(guān)控件,什么onMeasure()啦逆,onDraw()之類的都寫好了伞矩,不用關(guān)心了,而且這個開關(guān)需要我關(guān)心的就是他是開還是關(guān)的狀態(tài)夏志。這時候我們就需要一個回調(diào)方法乃坤,將開關(guān)的“開”和“關(guān)”狀態(tài)傳遞出來。好,你大概了解了功能和需求湿诊,以下是模擬控件的代碼狱杰,并非可以部署到真機上的代碼:
接口代碼:
// 狀態(tài)變化監(jiān)聽
interface StateChangeListener {
// 回調(diào)方法
void StateChange(boolean State);
}
開關(guān)控件代碼:
// 自定義開關(guān)--!
class OpenClose {
// 持有一個接口對象
StateChangeListener stateChangeListener;
// 提供注冊事件監(jiān)聽的方法
public void setOnChangeListener(StateChangeListener stateChangeListener) {
this.stateChangeListener = stateChangeListener;
//因為是模擬,所以需要在此將控件狀態(tài)傳出
IsClick(true);
}
//是否被點擊
public void IsClick(boolean isClick) {
// 通過接口對象傳控件狀態(tài)
stateChangeListener.StateChange(isClick);
}
}
測試代碼:
public class CallBackTest {
public static void main(String[] args) {
OpenClose oc = new OpenClose();
oc.setOnChangeListener(new StateChangeListener() {
@Override
public void StateChange(boolean State) {
if (State) {
System.out.println("開");
} else {
System.out.println("關(guān)");
}
}
});
}
}
我這還可以提供一張圖厅须,你可以很直觀的感受到這是個什么樣的控件
以上就是我的收獲浦旱,如果錯誤或者不同的看法和見解歡迎指出。
回調(diào)函數(shù)定義和機制來自:百度百科
推薦閱讀:
這篇文章不錯: java回調(diào)機制
文中提到的控件的實現(xiàn):Android:初識自定義控件