所谓回调,就是客户程序C调用服务程序S中的某个方法a,然后S又在某个时候反过来调用C中的某个方法b,对于C来说,这个b便叫做回调函数。
一般说来,C不会自己调用b,C提供b的目的就是让S来调用它,而且是C不得不提供。由于S并不知道C提供的b叫甚名谁,所以S会约定b的接口规范(函数原型),然后由C提前通过S的一个函数r告诉S自己将要使用b函数,这个过程称为回调函数的注册,r称为注册函数。
下面举个通俗的例子:
某天,我打电话向你请教问题,当然是个难题,:),你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。故事到此结束。
这个例子说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号码必须在以前告诉你,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。
如果你还不太清楚看看这段描述合和代码:
声明一个接口,另外一个类有方法里面有个参数以是这个接口类型的,而后在另外类中实现这个接口(java中多用的是匿名内部类),而且以这个匿名的类生成的对象为参数传到上面提到类中,而后实现回调.......这种用法可以参考java里面常用到的数据库操作所用到的几个接口.....
//声明一个接口
public interface ICallBack {
void postExec();
}
//另外一个类有方法里面有个参数以是这个接口类型的
public class Server {
private ICallBack callBack;
public void setCallBack(ICallBack callBack) {
this.callBack = callBack;
}
public void doSth() {
//可以做一些其他的工作,完成后调用回调方法,有点类似通知的意思
callBack.postExec();
}
}
//回调的实现
public class Client{
public static void main(String[] args) {
Server ser= new Server();
ser.setCallBack(new ICallBack() {
public void postExec() {
System.out.println("method executed.");
}
});
ser.doSth();//调用函数
}
}
另一个回调例子:
public interface ICallback {
public void func();
}
public class ClassWithCallbackFunction implements ICallback{
public ClassWithCallbackFunction() {
}
public void func(){
System.out.println("cccccccccccccccccc");
}
}
public class Caller {
ICallback callback;
public void doCallback() {
callback.func();
}
public void setCallback(ICallback callback) {
this.callback = callback;
}
}
public class MainClass {
public MainClass() {
}
public static void main(String[] args) {
Caller caller = new Caller();
caller.setCallback(new ClassWithCallbackFunction());
caller.doCallback();
}
}
现实中是把doCallback()方法放在setCallback里调用,以上是为了说明回调原理
public class Caller {
ICallback callback;
public void doCallback() {
callback.func();
}
public void setCallback(ICallback callback) {
this.callback = callback;
doCallback();
}
}
分享到:
相关推荐
base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz
关于java的笔试题,大家共享。阿里巴巴java笔试,希望对大家有用。
聊天工具的java开发 超越QQ 天翔ZZ,有两个压缩包,一个是服务器程序,另一个是客户端程序.真的不错的哦~~~
NULL 博文链接:https://greatwqs.iteye.com/blog/2429185
Java FizzBuzz 该存储库包括标准“Fizz Buzz”面试测试的各种基于 Java 的实现。 每个实现实际上都是独立的,但由于所选的实现是随机选择的,因此它们被打包为一个集体。
一维量子XX-ZZ模型的关联函数与协作参量,钟鸣,,采用把一维量子XX-ZZ模型映射到周期XY模型的方法,数值研究了该模型的关联函数及量子相变类型,以及协作参量在相变点附近的行为。�
ZZ561401.CAB ZZ561401.CAB ZZ561401.CAB
俄罗斯方块JAVA源代码,可自定义按键,彩色方块
在 Java 8 中使用函数式编程生成字母序列是一个很大的挑战。Lukas Eder 愉快地接受了这个挑战,他将告诉我们如何使用 Java 8 来生成ABC的序列——当然,肯定不是一种蹩脚的方式。 我被 Stack Overflow 上网友...
wincc SIMATIC WinCC是第一个使用最新的32位技术的过程监视系统,具有良好的开放性和灵活性。 从面市伊始,用户就对SIMATIC WinCC印象深刻。
FizzBuzz-Java-Gradle
总结Java标准类库的容器类; 容器类库是你每天都会用到的工具,它能使程序更简介,更强大并且更搞笑。
ZZ-2022015 液压与气动系统装调与维护赛项赛题 中职赛项 适合正在准备技能大赛的人群
在CAD中想要快速测量长度,在CAD工具栏找到加载应用程序,再点击加载 加载成功后在输入栏输入“zz”(不分大小写)在选择你需要测量的线段即可。
java-FizzBuzz
我们研究了四轻子最终状态ℓ+ℓ-ℓ+ℓ-的产生,这些状态主要由一对弱电Z玻色子ZZ产生。 使用LoopSim方法,我们合并ZZ和ZZ + jet的NLO QCD结果,并获得ZZ产生的近似NNLO预测。 还包括对ZZ过程的精确胶子融合环平方的...
java实现logistic回归算法 java实现logistic回归算法 java实现logistic回归算法
ZZ-2022033 电子电路装调与应用赛项赛题 中职赛项 适合正在准备技能大赛的人群
,主图指标,顶底信号,突破,转折信号,都很明显
。。。