回调(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、在自己做设计时碰到合适的场景也应该考虑采用同步或者异步的回调机制。