5 回答

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ì)模式中叫做觀察者模式。

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ì)看看代碼。

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

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)大。
添加回答
舉報(bào)