回调就是在 A 调用 B 的方法 C 去执行某个任务,在B执行完或者执行过程中需要告诉A一些信息而去调用A的 一个回调方法D。
简单点说,就是A调用B,B又调用A。
实现方式:
1.定义一个回调接口(interface)。
2.A调用B ,B通过回调接口 给A通讯。
回调可以分为异步回调和同步回调,区别只是你是否使用了线程。
场景一:客户端和服务器通信
1.首先定义一个回调接口:
public interface CallBackInterface { void callback(String response); }2.定义一个Client类,有一个用于发送信息的sendMsg方法,用了线程,所以是异步回调。这里用了匿名类的方式实现了回调接口。还有一个种方式就是,Client自己implement 回调接口,实现回调方法,那么给 recieveMsg传参数时,第二个参数可以是用this 关键字了。这种方式给新人理解回调的时候,可能比较好理解。
public class Client { private Server server; public void sendMsg(String msg){ new Thread(new Runnable() { @Override public void run() { server.recieveMsg(msg, new CallBackInterface() { @Override public void callback(String response) { System.out.println("response:"+response); } }); } }).start(); }}
3.定义一个Server类,有个recieveMsg方法用于接收信息
public class Server { public void recieveMsg(String msg,CallBackInterface callBackInter){ System.out.println("收到来自客户端的消息:"+msg); try { //模拟处理信息 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } callBackInter.callback("ok"); System.out.println("服务端执行结束。"); }}
4.测试一下:
public static void main(String[] args) { Server server=new Server(); Client client=new Client(server); System.out.println("开始发送消息"); client.sendMsg("我是客户端"); System.out.println("结束发送消息"); }输出结果:
开始发送消息
结束发送消息
收到来自客户端的消息:我是客户端
response:ok
服务端执行结束。
因为是异步回调,所以客户的发出消息,并没有等待服务器响应,而是继续执行。等服务器执行完,服务器通过回调方法给客户端发送消息。
场景二: 客户端上传文件到服务器端,服务器端返回上传进度
准备工作:还是场景一的2个类和一个回调接口,只是加了2个方法用于模拟文件上传。
Client类加了个upload方法
public void upload(){ server.reieveFile(new CallBackInterface() { @Override public void callback(String response) { System.out.println("上传进度:"+response+"%"); } }); }
Server类加了个recieveFile方法
public void reieveFile(CallBackInterface callBackInter) { System.out.println("接收文件开始"); for(int i=0;i<=100;i++){ //模拟文件上传过程 try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } callBackInter.callback(String.valueOf(i)); } }
测试一下:
public static void main(String[] args) { Server server=new Server(); Client client=new Client(server); // System.out.println("开始发送消息"); // client.sendMsg("我是客户端"); // System.out.println("结束发送消息"); System.out.println("开始上传文件"); client.upload(); System.out.println("结束上传文件"); }
输出结果:
开始上传文件
接收文件开始
上传进度:0%
上传进度:1%
上传进度:2%
上传进度:3%
上传进度:4%
上传进度:5%
上传进度:6%
上传进度:7%
上传进度:8%
上传进度:9%
上传进度:10%
上传进度:11%
上传进度:12%
上传进度:13%
上传进度:14%
上传进度:15%
上传进度:16%
上传进度:17%
上传进度:18%
上传进度:19%
上传进度:20%
上传进度:21%
上传进度:22%
上传进度:23%
上传进度:24%
上传进度:25%
上传进度:26%
上传进度:27%
上传进度:28%
上传进度:29%
上传进度:30%
上传进度:31%
上传进度:32%
上传进度:33%
上传进度:34%
上传进度:35%
上传进度:36%
上传进度:37%
上传进度:38%
上传进度:39%
上传进度:40%
上传进度:41%
上传进度:42%
上传进度:43%
上传进度:44%
上传进度:45%
上传进度:46%
上传进度:47%
上传进度:48%
上传进度:49%
上传进度:50%
上传进度:51%
上传进度:52%
上传进度:53%
上传进度:54%
上传进度:55%
上传进度:56%
上传进度:57%
上传进度:58%
上传进度:59%
上传进度:60%
上传进度:61%
上传进度:62%
上传进度:63%
上传进度:64%
上传进度:65%
上传进度:66%
上传进度:67%
上传进度:68%
上传进度:69%
上传进度:70%
上传进度:71%
上传进度:72%
上传进度:73%
上传进度:74%
上传进度:75%
上传进度:76%
上传进度:77%
上传进度:78%
上传进度:79%
上传进度:80%
上传进度:81%
上传进度:82%
上传进度:83%
上传进度:84%
上传进度:85%
上传进度:86%
上传进度:87%
上传进度:88%
上传进度:89%
上传进度:90%
上传进度:91%
上传进度:92%
上传进度:93%
上传进度:94%
上传进度:95%
上传进度:96%
上传进度:97%
上传进度:98%
上传进度:99%
上传进度:100%
结束上传文件
这个场景下,就是同步回调,客户端等服务器执行完才往下走,但是,过程中,服务器多次回调了客户端的回调方法,通知其上传进度。