接口回調能實現(xiàn)的核心:接口對象可以被替換為實現(xiàn)這個接口的類的對象
//不會報錯
InterfaceA a;
a=new A();
回調一直是一個JAVA中很重要的概念朋凉,應用場景:
A.class需要使用B.class的方法,然后A還需要在B的方法執(zhí)行完畢后给梅,作出對應反應,即在B的方法中還需要回調到將它new出來的A的方法末购。
為了方便理解破喻,我們用到接口,做個簡單的demo:
學生做完了作業(yè)盟榴,需要找家長檢查,家長檢查學生的作業(yè)是否準確完成婴噩,如果完成了就告訴學生可以玩游戲了擎场,否則告訴學生繼續(xù)做作業(yè)。
第一步:建立學生接口:InterfaceStudent (家長可以通過這個接口來找到學生并告訴他需要做的事情)
public interface InterfaceStudent {
void playGame();//學生可以玩游戲了
void doHomework();//學生還要寫作業(yè)
}
第二步:建立學生類几莽,實現(xiàn)這個接口 并且實現(xiàn)方法CheckHomework()來請家長幫忙檢查作業(yè)
public class Student implements InterfaceStudent {
public boolean isMyHomeworkFinishde;//判斷作業(yè)是否寫完
private Parents mParents;//這個學生對應的家長
Student(){//重寫構造方法 建立學生對象時 也 建立其對應家長對象
mParents=new Parents(this);
}
void setMyHomeworkFinishde(boolean isMyHomeworkFinishde){
this.isMyHomeworkFinishde=isMyHomeworkFinishde;
}
void CheckHomework(){//請家長來檢查作業(yè)
mParents.check(this.isMyHomeworkFinishde);
}
@Override
public void playGame() {
System.out.println("可以打游戲了迅办!");
}
@Override
public void doHomework() {
System.out.println("繼續(xù)寫作業(yè)!");
}
}
建立Parents.class來實現(xiàn)檢查作業(yè)的方法check()章蚣,并根據(jù)情況回調學生的玩游戲或者繼續(xù)寫作業(yè)方法
public class Parents {//家長 來判斷學生該做什么
InterfaceStudent mStudent;//先通過接口建立家長對應的學生對象
Parents(Student mStudent){//綁定家長和學生
this.mStudent=mStudent;
}
//檢查學生的作業(yè) 看看是否完成 并對學生作出相應指示
public void check(boolean isMyHomeworkFinishde){
if (isMyHomeworkFinishde){
mStudent.playGame();
}
else{
mStudent.doHomework();
}
};
}
最后就是Test類啦:
public class Test {
public static void main(String[] args){
//A同學作業(yè)沒有完成讓家長檢查
Student studentA=new Student();
studentA.setMyHomeworkFinishde(false);
studentA.CheckHomework();
//B同學作業(yè)完成讓家長檢查
Student studentB=new Student();
studentB.setMyHomeworkFinishde(true);
studentB.CheckHomework();
}
}
運行結果就這樣的啦:
繼續(xù)寫作業(yè)站欺!
可以打游戲了!
Process finished with exit code 0
以上就是比較好理解的“接口回調”了
看到這里,有些同學可能要問了:這不坑爹嗎矾策!這個InterfaceStudent接口起個毛用呀磷账!我直接在Parents里邊聲明Student對象 構造函數(shù)傳入學生對象不就好了嗎?如下:
//這種方式也是可行的 但不推薦 因為請家長檢查作業(yè)的不一定是學生
//比如我家的dog也實現(xiàn)了InterfaceStudent接口 請家長檢查作業(yè)呢 對吧
//android開發(fā)中 activity和fragment有時候會共用一個presenter
public class Parents {//家長 來判斷學生該做什么
private Student mStudent;
Parents(Student mStudent){
this.mStudent=mStudent;
}}
暴躁老哥稍安勿躁,以上例子其實是個非常簡單的示范贾虽,但至少還是是實現(xiàn)了回調這個機制呀逃糟。在以上做法中,加入接口反而讓代碼顯得多余蓬豁。但其實再大型項目中绰咽,這個接口的存在非常重要,因為項目中有多個家長和多個學生地粪,我們需要這個接口來統(tǒng)一規(guī)定學生和父母能做的事情取募,方便管理。(瞎機吧扯蟆技,這樣做的原因除了滿足一些特殊需求外矛辕,主要還是為了解耦)
那么接下來我們可以稍微擴展一下:
如果我們在原本的基礎上增加一個要求:學生在等待家長檢查作業(yè)的時候,可以先去吃飯付魔,那么是不是就需要開一個線程聊品,這個線程中家長去檢查作業(yè),學生自己去做自己的事情几苍,家長檢查完畢再作出反饋翻屈。這種方式叫做異步回調。
很簡單妻坝,只需要在學生請家長檢查作業(yè)的方法中加入一個線程就可以了:
void CheckHomework(){//請家長來檢查作業(yè)
//異步請求
new Thread(new Runnable() {
@Override
public void run() {
mParents.check(isMyHomeworkFinishde);
}
}).start();
this.doOther();
}
public void doOther(){
System.out.println("我先去掃地啦伸眶!");
}
運行結果:
我先去掃地啦厘贼!
我先去掃地啦圣拄!
繼續(xù)寫作業(yè)!
可以打游戲了岳掐!
Process finished with exit code 0
總結一下,以上的接口回調其實不規(guī)范
1.應該在main中建立parents對象串述,然后通過student構造函數(shù)賦值寞肖,我直接在構造函數(shù)中new了
2.parents傳入Student對象應該在check中添加Student形參衰腌,然后再賦值觅赊,或者單獨給一個方法給student賦值
因為parent也會有單獨的屬性事情要設置等待
以上都是代碼規(guī)范的問題,以后多多注意尤泽!
在android的開發(fā)中MVP架構大量使用了接口回調规脸,并且封裝的很好,要習慣這種解耦方式闹丐。