回调使用场景:用一个统一的接口实现不同的功能的时候,这时候回调机制就会派上用场
1、同步回调,即阻塞,单向。
2、回调,即双向(类似自行车的两个齿轮)。
3、异步调用,即通过异步消息进行通知
比如这里模拟个场景:客户端发送msg给服务端,服务端处理后(5秒),回调给客户端,告知处理成功。代码如下:
回调接口类:
回调步骤:
1.首先,定义一个接口”interface in”,其中有方法inFun;
2.然后,定义类”class B implements in”,并实现接口in中的方法inFun,且有方法funB;
3.接着,定义类”class A”,其中有方法funA,且funA的形参中有一个为接口in类型,该方法被B的方法funB调用,并在该方法中调用方法inFun,由于方法inFun在类B中实现,所以inFun即可以称为类B的回调函数;
4.最后,由主函数来调用类B中的方法funB,即可以实现回调
//定义一个回调接口,包含一个回调函数
public interface CSCallBack {
public void process(String status);
}
模拟客户端:
public class Client implements CSCallBack {
private 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() {
//异步处理逻辑
server.getClientMsg(Client.this,msg);
}
}).start();
System.out.println("客户端:异步发送成功");
}
@Override
public void process(String status) {
System.out.println("客户端:服务端回调状态为:" + status);
}
}
模拟服务端:
public class Server {
public void getClientMsg(CSCallBack csCallBack , String msg) {
System.out.println("服务端:服务端接收到客户端发送的消息为:" + msg);
// 模拟服务端需要对数据处理
try {
Thread.sleep(5 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("服务端:数据处理成功,返回成功状态 200");
String status = "200";
csCallBack.process(status);
}
}
测试类:
public class CallBackTest {
public static void main(String[] args) {
Server server = new Server();
Client client = new Client(server);
client.sendMsg("Server,Hello~");
}
}
接口作为方法参数,其实际传入引用指向的是实现类。
1.回调函数也是一个函数或过程,不过它是一个由调用方自己实现,供被调用方使用的特殊函数。
2.即调用方A不直接使用此函数function,而是通过调用被调用方B来间接调用function。