java 回调机制

回调就是在 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%

结束上传文件

这个场景下,就是同步回调,客户端等服务器执行完才往下走,但是,过程中,服务器多次回调了客户端的回调方法,通知其上传进度。




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值