回调(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
上述代码完成的过程是模拟异步回调,回调分为同步和异步,区别就是需不须要等待服务器端的返回结果,本例中在客户端发送消息时加入了线程执行,就体现了异步。
感悟:
一、对回调机制要知其然知其因此然,用起来才更加顺手;
二、在本身作设计时碰到合适的场景也应该考虑采用同步或者异步的回调机制。