Android之回調(diào)函數(shù)

最近對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:初識自定義控件

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末九杂,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宣蠕,更是在濱河造成了極大的恐慌例隆,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抢蚀,死亡現(xiàn)場離奇詭異镀层,居然都是意外死亡,警方通過查閱死者的電腦和手機皿曲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門唱逢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人屋休,你說我怎么就攤上這事坞古。” “怎么了劫樟?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵痪枫,是天一觀的道長。 經(jīng)常有香客問我叠艳,道長奶陈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任附较,我火速辦了婚禮吃粒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拒课。我一直安慰自己徐勃,他們只是感情好,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布捕发。 她就那樣靜靜地躺著疏旨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪扎酷。 梳的紋絲不亂的頭發(fā)上檐涝,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機與錄音,去河邊找鬼谁榜。 笑死幅聘,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的窃植。 我是一名探鬼主播帝蒿,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼巷怜!你這毒婦竟也來了葛超?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤延塑,失蹤者是張志新(化名)和其女友劉穎绣张,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體关带,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡侥涵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了宋雏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芜飘。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖磨总,靈堂內(nèi)的尸體忽然破棺而出嗦明,到底是詐尸還是另有隱情,我是刑警寧澤舍败,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布招狸,位于F島的核電站,受9級特大地震影響邻薯,放射性物質(zhì)發(fā)生泄漏裙戏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一厕诡、第九天 我趴在偏房一處隱蔽的房頂上張望累榜。 院中可真熱鬧,春花似錦灵嫌、人聲如沸壹罚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽猖凛。三九已至,卻和暖如春绪穆,著一層夾襖步出監(jiān)牢的瞬間辨泳,已是汗流浹背虱岂。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留菠红,地道東北人第岖。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像试溯,于是被迫代替她去往敵國和親蔑滓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,283評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫遇绞、插件键袱、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,119評論 4 61
  • 一個月前Rose打電話給我钩骇,電話接通先傳來一陣抽泣,接著“木木铝量,你倘屹,你知道嗎?特別……特別狗血的劇情發(fā)生在我身上了...
    許木木閱讀 396評論 0 0
  • 昨日一口氣跑了三公里慢叨,手機彈出一個窗口纽匙,說我是點亮了單程三公里的一個勛章,玩手機里看了一下拍谐,還有一個去跑五公里烛缔,十...
    飛城閱讀 161評論 0 0
  • 這兩天上班我都是步行來的,今天由于起的太晚轩拨,步行來到公司已經(jīng)遲到了践瓷。如果我要想不遲到又能吃上早飯,那么我最遲要7點...
    魂歸瀟湘閱讀 195評論 0 0