同步回撥與非同步回撥的實現與學習
這段時間學習java的回撥機制,在網上包括部落格尋找了許多關於回撥的一些文章和文獻,最終自己嘗試著理解和寫了一些回撥的實現用作學習理解,話不多說,直接上主菜。(本人新人入坑,只是闡述了自己的理解與實現,歡迎大家交流批評~)
回撥我這裡說兩種,一個是同步回撥,一個是非同步回撥。(文章最後有圖解,聽說程式碼和圖片在一起更配哦~)
同步回撥(程式碼是寫給有恆心之人)
這裡我先把同步回撥程式碼貼出來
情景;小明和小芳在聊天,小明問小芳在做什麼,小芳馬上回答了後,小明便說收到了
這裡先定義了一個介面
public interface CallBackInterface { public void execute(); }
然後實現小明的類,他實現了上面的介面。
public class XiaoMing implements CallBackInterface{
public XiaoMing(){
System.out.println("小芳在做啥?");
}
public void execute() {
System.out.println("收到了!!" );
}
}
然後定義小芳的類
最後便是做場景的main方法啦public class XiaoFang { private CallBackInterface callback; public XiaoFang(){ } public XiaoFang(CallBackInterface callback){ this.callback = callback; } public void doSome(){ System.out.println("我剛才去洗碗了!"); //I can call you back callback.execute(); } }
public class MainC {
public static void main(String[] args){
System.out.println("單執行緒同步回撥");
XiaoMing xiaoming = new XiaoMing();
XiaoFang x2 = new XiaoFang(xiaoming);
x2.doSome();
}
}
執行結果;單執行緒同步回撥
小芳在做啥?
我剛才去洗碗了!
收到了!!
讓我們來捋一捋思路,小明的實現的callback介面就像是一個可供回話的電話號碼,小明在主方法中先例項化了自己(問小芳在做啥),並在其中留下了一個回話的方法(當然小明是不可能知道小芳會講什麼的 )。然後小芳例項化了自己,並把小明的問題和回話方法拿到並做出了迴應(“我剛才去洗碗了”),然後打電話(callback.execute()),小明這時便收到了訊息(我收到了)。這個例子中不難看到回撥的身影,小明a->小芳b->小明a的回答。
再來看看非同步回撥。
情景;小明問小芳在做啥,然後小明便出門了,小明留下了一臺可供收訊息的留言機,小芳過了一會才收到訊息並回復。
上程式碼
還是先定義一個callback介面
public interface CallBack {
public void result();
}
然後是小明的方法public class XiaoMing implements CallBack{
public XiaoMing(){
System.out.println("小芳在做啥?");
}
public void result() {
System.out.println("小明回答;收到!");
}
}
小芳
public class XiaoFang implements Runnable{
public CallBack callback;
public XiaoFang (CallBack callback){
this.callback = callback;
}
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("過了兩秒小芳才回答");
System.out.println("我去喝奶茶了");
callback.result();
}
}
然後便是主場景MainA
public class MainA {
public static void main(String[] args){
XiaoMing x = new XiaoMing();
XiaoFang xiaofang = new XiaoFang(x);
new Thread(xiaofang).start();
System.out.println("小明問完就出門買東西了");
}
}
執行結果;
小芳在做啥?
小明問完就出門買東西了
過了兩秒小芳才回答
我去喝奶茶了
小明回答;收到!
可以看到,非同步回撥與同步回撥並沒有太大的區別,唯一的區別便是小芳這次沒有馬上回答,而是等了一會才回了訊息(新開執行緒),但是回撥的實現還是基本一模一樣的,還是小明a->小芳b(等待後)->小明a的回答。
當然了,多執行緒回撥的實際開發我覺得可能更多用在網路請求中。
最後,不多解釋,上圖!
沒錯這就是回撥的流程圖解,
1,首先兩個物件都實現了callback介面,物件A(小明)在他其中實現了callback具體要做的事 ;
2,然後物件B(小芳),會取得物件A(小明的)傳入的callback,也就是this.callback = callback ;
3,這時,物件B(小芳)執行的便是物件A(小明)實現的介面callback的方法啦(“收到了”)!
是不是很眼熟,對了你想的沒錯,就是android的點選事件,我們平時寫的匿名onclicklistener就是我們的小明,而小芳就是我們用的控制元件(你可以在button原始碼裡發現this.onclicklisten = onclicklisten ~ . ~)。具體的實際運用大家就自己去研究拉~(如果你覺得這篇文章值得一讀,那希望讀者大人們能為作者點個贊哦~)