Java回调实例
通过代码来展示回调机制
回调:简单来说就是A调用B,B在执行完某些操作后自动调用A的方法;回调机制也体现了面向接口编程的好处。
这里可能涉及到几个概念:同步、异步、回调
同步:是一种阻塞的方式,A调用B,必须等待B处理完成后才能进行往下经行;
异步:是一种并行的方式,A调用B,不必等待B而继续处理A自己的事情;
回调:算是异步的一种,A调用B,A继续接着处理自己的逻辑,A必须实现一个接口,B处理完后再把结果通知给A;
step1: 首先定义一个回调接口;
1 public interface CSCallBack { 2 3 public void process(String status); 4 }
step2: 定义服务器类
1 /* 2 * step2 : 定义服务器类,处理客户端传来的数据 3 */ 4 public class Server { 5 //定义一个方法用来接受客户端的消息并通过回调方法告诉客户端已经收到消息; 6 public void getClientMsg(CSCallBack callback,String msg){ 7 System.out.println("服务端:服务端接收到客户端消息:"+msg); 8 9 try { 10 Thread.sleep(5*1000); //模拟耗时处理逻辑 11 } catch (InterruptedException e) { 12 // TODO Auto-generated catch block 13 e.printStackTrace(); 14 } 15 16 System.out.println("服务端:服务端数据处理成功,返回状态:001"); 17 String status = "001"; 18 callback.process(status); 19 } 20 }
step3: 定义客户端,并实现CSCallBack接口,并把服务端Service类组合到客户端类里面;
1 /* 2 * step3: 定义客户端,异步向服务器发送消息 3 */ 4 public class Client implements CSCallBack{ 5 private Server server ; //组合服务端类 6 7 public Client(Server server){ 8 this.server = server; 9 } 10 11 public void sendMsg(final String msg){ 12 System.out.println("客户端:客户端向服务端发送消息:"+msg); 13 14 new Thread(new Runnable(){ 15 16 @Override 17 public void run() { 18 // 为了让Service实现回调,需要把本类的引用传给Service,然后实现在Service调用Client的方法,也就是传说中的回调 19 server.getClientMsg(Client.this, msg); //因为要被内部类一个新的线程可以使用,所以msg必须是final 20 } 21 22 }).start(); 23 System.out.println("客户端:客户端异步消息发送成功。"); 24 } 25 26 @Override 27 public void process(String status) { 28 // TODO Auto-generated method stub 29 System.out.println("客户端:收到服务端的回调状态为:"+status); 30 } 31 32 }
step4: 编写测试类
1 public class CallBackDemo { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 // TODO Auto-generated method stub 8 Server server = new Server(); 9 Client client = new Client(server); 10 client.sendMsg("Hello, Server..."); 11 } 12 13 }
边系鞋带边思考人生.