回調(callback)在咱們作工程過程當中常常會使用到,今天想整理一下回調的原理和使用方法。服務器
回調的原理能夠簡單理解爲:A發送消息給B,B處理完後告訴A處理結果。再簡單點就是A調用B,B調用A。異步
那麼是如何實現的呢?通常而言,處理消息的類是惟一的,而發送消息的類倒是各類各樣的,因此通常的作法是將回調方法作成一個接口,不一樣的發送者去實現該接口,而且把本身的接口實現類的對象在發送消息時傳遞給消息處理者。ide
(如今不太方便畫圖,以後再補上圖)測試
如今以一個CS結構的示例來講明回調的過程:this
Client類:spa
package com.test.callback; /** * Created by puyangsky on 2016/6/13. */ public class Client { Server server; public Client(Server server) { this.server = server; } public void sendMsg(final String msg) { System.out.println("客戶端正在發生消息:" + msg); new Thread(new Runnable() { @Override public void run() { try {
//調用server類的獲取消息方法,而且傳入myCallback對象 server.getMsg(new myCallback(), msg); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); }
//實現Callback接口 private class myCallback implements Callback { @Override public void process(int status) { System.out.println("處理成功,返回狀態爲:" + status); } } }
回調接口類:線程
interface Callback { void process(int status); }
Server類:設計
package com.test.callback; /** * Created by puyangsky on 2016/6/13. */ public class Server { public void getMsg(Callback callback, String msg) throws InterruptedException { System.out.println("服務端得到消息:" + msg); //模擬處理消息過程,等待兩秒
Thread.sleep(2000); System.out.println("服務端處理成功,返回狀態爲200");
//處理完消息,調用回調方法,告知客戶端 callback.process(200); } }
測試類:3d
package com.test.callback; /** * Created by Administrator on 2016/6/13. */ public class CallbackTest { public static void main(String[] args) { Server server = new Server(); Client client = new Client(server); client.sendMsg("hello"); } }
輸出結果:code
上述代碼完成的過程是模擬異步回調,回調分爲同步和異步,區別就是需不須要等待服務器端的返回結果,本例中在客戶端發送消息時加入了線程執行,就體現了異步。
感悟:
一、對回調機制要知其然知其因此然,用起來才更加順手;
二、在本身作設計時碰到合適的場景也應該考慮採用同步或者異步的回調機制。