1. 程式人生 > >同步回撥與非同步回撥的實現與學習

同步回撥與非同步回撥的實現與學習

這段時間學習java的回撥機制,在網上包括部落格尋找了許多關於回撥的一些文章和文獻,最終自己嘗試著理解和寫了一些回撥的實現用作學習理解,話不多說,直接上主菜。(本人新人入坑,只是闡述了自己的理解與實現,歡迎大家交流批評~)

回撥我這裡說兩種,一個是同步回撥,一個是非同步回撥。(文章最後有圖解,聽說程式碼和圖片在一起更配哦~)

同步回撥(程式碼是寫給有恆心之人)

這裡我先把同步回撥程式碼貼出來

情景;小明和小芳在聊天,小明問小芳在做什麼,小芳馬上回答了後,小明便說收到了

這裡先定義了一個介面

public interface CallBackInterface {
	 public void execute();  
}

然後實現小明的類,他實現了上面的介面。

public class XiaoMing implements CallBackInterface{
	
	public XiaoMing(){
		System.out.println("小芳在做啥?");
	}
     
    public void execute() {  
        System.out.println("收到了!!" );  
        
          
    }  
}

然後定義小芳的類
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();  
    }  
}
最後便是做場景的main方法啦
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 ~ . ~)。具體的實際運用大家就自己去研究拉~(如果你覺得這篇文章值得一讀,那希望讀者大人們能為作者點個贊哦~)