回調(callback)在我們做工程過程中經常會使用到,今天想整理一下回調的原理和使用方法。
回調的原理可以簡單理解為:A發送消息給B,B處理完后告訴A處理結果。再簡單點就是A調用B,B調用A。
那么是如何實現的呢?一般而言,處理消息的類是唯一的,而發送消息的類卻是各種各樣的,所以一般的做法是將回調方法做成一個接口,不同的發送者去實現該接口,並且把自己的接口實現類的對象在發送消息時傳遞給消息處理者。
(現在不太方便畫圖,之后再補上圖)
現在以一個CS結構的示例來說明回調的過程:
Client類:
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); } }
測試類:
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"); } }
輸出結果:
上述代碼完成的過程是模擬異步回調,回調分為同步和異步,區別就是需不需要等待服務器端的返回結果,本例中在客戶端發送消息時加入了線程執行,就體現了異步。
感悟:
1、對回調機制要知其然知其所以然,用起來才更加順手;
2、在自己做設計時碰到合適的場景也應該考慮采用同步或者異步的回調機制。