第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

自己寫(xiě)的 interface 為什么能作為監(jiān)聽(tīng)器?

自己寫(xiě)的 interface 為什么能作為監(jiān)聽(tīng)器?

12345678_0001 2019-03-21 18:15:33
Android 里面自定義監(jiān)聽(tīng)器我沒(méi)搞明白. 監(jiān)聽(tīng)器是能夠做到每時(shí)每刻監(jiān)聽(tīng)是嗎? 那像這些自己寫(xiě)出來(lái)的監(jiān)聽(tīng)器究竟是怎么做到監(jiān)聽(tīng)的?像這個(gè)Android 幫助文檔上的實(shí)現(xiàn) dialog 的代碼(代碼如下), 自己編的一個(gè) interface 被 MainActivity 繼承為什么就能做到監(jiān)聽(tīng)? — NoticeDialogListener為什么能夠接收到點(diǎn)擊按鈕的事件呢?以下是上述文檔的代碼. 當(dāng)然我問(wèn)的也不僅僅是這個(gè)代碼了… 謝謝回答!For example, here's a DialogFragment that defines an interface throughwhich it delivers the events back to the host activity:public class NoticeDialogFragment extends DialogFragment {    /* The activity that creates an instance of this dialog fragment must     * implement this interface in order to receive event callbacks.     * Each method passes the DialogFragment in case the host needs to query it. */    public interface NoticeDialogListener {        public void onDialogPositiveClick(DialogFragment dialog);        public void onDialogNegativeClick(DialogFragment dialog);    }    // Use this instance of the interface to deliver action events    NoticeDialogListener mListener;    // Override the Fragment.onAttach() method to instantiate the NoticeDialogListener    @Override    public void onAttach(Activity activity) {        super.onAttach(activity);        // Verify that the host activity implements the callback interface        try {            // Instantiate the NoticeDialogListener so we can send events to the host            mListener = (NoticeDialogListener) activity;        } catch (ClassCastException e) {            // The activity doesn't implement the interface, throw exception            throw new ClassCastException(activity.toString()                    + " must implement NoticeDialogListener");        }    }    ... }The activity hosting the dialog creates an instance of the dialog withthe dialog fragment's constructor and receives the dialog's eventsthrough an implementation of the NoticeDialogListener interface:public class MainActivity extends FragmentActivity                          implements NoticeDialogFragment.NoticeDialogListener{    ...  
查看完整描述

5 回答

?
慕尼黑5688855

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超2個(gè)贊

這本質(zhì)上是一個(gè)方法調(diào)用。假設(shè)我們有兩個(gè)類A和B,我們期望在A的某個(gè)時(shí)刻調(diào)用B的某個(gè)方法,我們可以讓A保持一個(gè)B的引用,在合適的時(shí)機(jī)進(jìn)行方法調(diào)用:


class B {

? ? void doSomething() {}

}


class A {

? ? private B b;

? ??

? ? public void setB(B b) {

? ? ? ? // 保持一個(gè)B的引用

? ? ? ? this.b = b;

? ? }

? ??

? ? public void testMethod() {

? ? ? ? // ...

? ? ? ? // 在A的某個(gè)時(shí)刻調(diào)用B的某個(gè)方法

? ? ? ? b.doSomething();

? ? ? ? // ...

? ? }

}

以上代碼實(shí)現(xiàn)了,在A的某個(gè)時(shí)刻(發(fā)生某件事情的時(shí)候),我們通知B去做一些事情,這就是一個(gè)簡(jiǎn)單的監(jiān)聽(tīng)模式。你看,這里并不是B時(shí)時(shí)刻刻去監(jiān)聽(tīng)A的動(dòng)作,而是在某個(gè)時(shí)刻A主動(dòng)觸發(fā)了B的方法。


在這里,把B換成Listener,就變成了我們熟悉的監(jiān)聽(tīng)器。


所以我們可以寫(xiě)一個(gè)B的子類,也就實(shí)現(xiàn)了一個(gè)自定義監(jiān)聽(tīng)器:


class SubB extends B {

? ? @override

? ? void doSomething() {}

}


void main() {

? ? A a = new A();

? ? // 給A設(shè)置我們自定義的監(jiān)聽(tīng)器

? ? a.setB(new SubB());

? ? a.testMethod();

}

在設(shè)計(jì)模式方面,有一條推薦的做法,叫做“多用組合,少用繼承”,意思是說(shuō)應(yīng)該多用接口而少用繼承,我們把上面的B改成接口:


interface B {

? ? void doSomething();

}

然后把之前繼承的實(shí)現(xiàn)換成接口的實(shí)現(xiàn):


class SubB implements B {

? ? void doSomething() {}

}

void main() {

? ? A a = new A();

? ? // 給A設(shè)置我們自定義的監(jiān)聽(tīng)器

? ? a.setB(new SubB());

? ? a.testMethod();

}

你可以看到,用法和之前是完全一樣的。


把interface B換成interface OnClickListener,是不是就清晰很多了?這在設(shè)計(jì)模式中叫做觀察者模式。


查看完整回答
反對(duì) 回復(fù) 2019-04-24
?
慕碼人8056858

TA貢獻(xiàn)1803條經(jīng)驗(yàn) 獲得超6個(gè)贊

不要字面的理解監(jiān)聽(tīng)器,它不是主動(dòng)去檢查時(shí)間是否發(fā)生的,所以不存在每時(shí)每刻這種說(shuō)法。
對(duì)于我們來(lái)說(shuō),Android中的Listener其實(shí)只是一種Callback,是回調(diào)方法。是當(dāng)事件發(fā)生時(shí),由事件發(fā)起者或者內(nèi)部處理者調(diào)用的方法。
自己編寫(xiě)的Listener類并不是因?yàn)槔^承了誰(shuí)誰(shuí)誰(shuí)就能監(jiān)聽(tīng)事件,而是要想辦法告訴事件的發(fā)起者或者內(nèi)部處理者,事件發(fā)生時(shí),需要調(diào)用這個(gè)Listener中的指定方法,這也就是通常所要做的setListener的過(guò)程。

你給出的代碼里已經(jīng)把這個(gè)邏輯演繹得非常清楚,請(qǐng)先仔細(xì)看看代碼。


查看完整回答
反對(duì) 回復(fù) 2019-04-24
?
慕神8447489

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超1個(gè)贊

Java的Listener是規(guī)定回調(diào)函數(shù)的接口。Listener的實(shí)現(xiàn)類(一般是匿名內(nèi)部類)是回調(diào)函數(shù)對(duì)象本身。Java里面要是想傳遞一個(gè)函數(shù)對(duì)象(也稱為閉包),就需要這樣做。


查看完整回答
反對(duì) 回復(fù) 2019-04-24
?
開(kāi)心每一天1111

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超13個(gè)贊

其實(shí)你只要上課認(rèn)真聽(tīng)講了,下課認(rèn)真把老師打的代碼打了一遍,你就明白這個(gè)問(wèn)題了,
可以肯定的是,總是喜歡把問(wèn)題拖著,到后來(lái)再弄清楚,這樣是不行的。
建議多打代碼,每天不少于700行。
你覺(jué)得沒(méi)代碼打?問(wèn)別人弄清楚的問(wèn)題,那個(gè)代碼一定要打3遍,沒(méi)代碼打就打些有意義的小程序。
堅(jiān)持打代碼,就是從一開(kāi)始就堅(jiān)持強(qiáng)大。

查看完整回答
反對(duì) 回復(fù) 2019-04-24
  • 5 回答
  • 0 關(guān)注
  • 760 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)