回调(callback)在我们做工程过程中经常会使用到,今天想整理一下回调的原理和使用方法。

回调的原理可以简单理解为:A发送消息给B,B处理完后告诉A处理结果。再简单点就是A调用B,B调用A。

那么是如何实现的呢?一般而言,处理消息的类是唯一的,而发送消息的类却是各种各样的,所以一般的做法是将回调方法做成一个接口,不同的发送者去实现该接口,并且把自己的接口实现类的对象在发送消息时传递给消息处理者。

(现在不太方便画图,之后再补上图)

现在以一个CS结构的示例来说明回调的过程:

Client类:

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);
}
}

测试类:

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");
}
}

输出结果:

上述代码完成的过程是模拟异步回调,回调分为同步和异步,区别就是需不需要等待服务器端的返回结果,本例中在客户端发送消息时加入了线程执行,就体现了异步。

感悟:

1、对回调机制要知其然知其所以然,用起来才更加顺手;

2、在自己做设计时碰到合适的场景也应该考虑采用同步或者异步的回调机制。

最新文章

  1. C++多线程のpackage_task
  2. Jquery day02
  3. nginx参数说明
  4. C++程序设计(三)
  5. mongo
  6. redis学习(二) Redis Hash
  7. The 7th Zhejiang Provincial Collegiate Programming Contest->Problem G:G - Wu Xing
  8. 转载 GUID介绍
  9. HDU1878欧拉回路
  10. h2 database
  11. TeleMCU视频会议之Android版本号WebRTC client支持
  12. MySQL的字符串函数截取字符
  13. HPQC HP Quality Center windows 服务
  14. 36.java_exception_test
  15. 接口测试入门(4)--接口自动化测试框架 / list和map用法 / 随机选取新闻 (随机数生成) / 接口相关id映射
  16. .Net语言 APP开发平台——Smobiler学习日志:SmoOne新增考勤功能
  17. rmq区间最值
  18. 搜狗浏览器总是打开123.sogou.com-记搜狗浏览器遭遇劫持一例
  19. 《Android Studio开发实战 从零基础到App上线》资源下载和内容勘误
  20. 深入理解VMware虚拟机网络通信原理

热门文章

  1. OScached页面缓存的入门使用
  2. 基于html5的动画库,非svg和canvas
  3. java 错误: 找不到或无法加载主类解决方法
  4. 完全教程 Aircrack-ng破解WEP、WPA-PSK加密利器
  5. Ubuntu安装pip
  6. KVM虚拟机建立快照
  7. 函数导出在kvm_intel.ko,kvm.ko不共享
  8. 【NOIP2016】组合数问题
  9. 微软推出ASP.NET Core 2.0,并支持更新Visual Studio 2017
  10. MySQL的读写分离---主从复制、主主复制