1. 写在前面
之前只是听了很多次回调,知道这是 java 中的一种设计模式,今天就让我们来系统的看一下Callback 这个东西。
2. 概念
2.1 使用场景
当一个方法调用另外一个方法,等另一个方法执行完成后,将结果通知自己,这个就叫做 callback。
我去问小红问题,小红有事情在忙,等他处理完,把结果告诉我,这就叫做回调。
2.2 定义
将 Callback function(回调函数) 当作参数传入另外一个函数中,以便在合适的时候,调用该 callback 方法。
这个定义其实也指出了 实现方式。
3. 基础知识
函数的调用方式无非有以下几种:
- 同步调用
- 异步调用
- 回调
回调当然也有同步回调和异步回调。
3.1 同步调用
同步调用是一种阻塞式的调用,在 a()
方法调用 b()
方法时,只能等到 b()
方法执行完成之后, a()
方法才可以继续向下执行。
当然,a()
方法可以拿到 b()
方法返回的结果。
3.2 异步调用
异步调用是非阻塞的。不用等到后者执行,前者继续执行。
3.3 回调
回调的核心在于 互相调用。即在 a()
调用 b()
的时候,到达合适的时机,b()
也会调用a()
。
这里跟同步调用的不同就在于,回调。
举一个例子,老师布置作业,学生去做,最终老师拿到了学生交的作业(返回值)。这就是一个同步调用。
老师布置,学生做,做完了告诉老师(callback),我做完了。这就是一个回调
4. 实现方式
在上面的定义里面也提过,将回调方法自己作为参数传递给被调用的参数,是回调实现的核心。
这里有一个很有趣的例子,来自于 https://www.shuzhiduo.com/A/Lq4zVjGzKr/。
这里分3个阶段来解读这个例子:
4.1 老师出题
老师给小明在黑板上出了一道题目,1+1=__
填空。
凭借自己的能力,小明很容易搞出来了这个问题。
public class XiaoMing {
private String name;
public void setName(String name){
this.name = name;
}
public XiaoMing(String name){
this.name = name;
}
private int add(int ele1, int ele2){
return ele1+ele2;
}
private void fillBlank(int ele1, int ele2){
int result = add(ele1,ele2);
System.out.println(name+"计算:"+ele1+"+"+ele2+"="+result);
}
}
4.2 老师刁难
老师看到小明做出来了,作为变态的她,又出了一个超级难的题目。 524+281=__
填空。
小明直接头大,被气的鸡儿梆硬。但是还是硬着头皮做了。
天无绝人之路,小红带着计算器出现了。
小明现在可以求助小红和计算器了(此时将二者看作一个整体)。因此小明可以把任务交给小红和计算器,然后自己出去玩。但是此时小明需要将 两个加数
和需要填空的地方
告诉小红,最好的方法就是把自己的引用
和两个加数
告诉她。
小红做完之后,再调用小明的填空方法,完成填空。
package callback;
/**
* @author mikeshine
*/
public class XiaoMing {
private String name;
public void setName(String name){
this.name = name;
}
public XiaoMing(String name){
this.name = name;
}
public void callHelp(int ele1, int ele2){
new XiaoHong().calculator(ele1,ele2,this); // 这里是核心
}
public void fillBlank(int ele1, int ele2, int result){
System.out.println(name+"计算:"+ele1+"+"+ele2+"="+result);
}
}
package callback;
/**
* @author mikeshine
*/
public class XiaoHong {
public void calculator(int a, int b, XiaoMing xiaoMing){
int result = a+b;
xiaoMing.fillBlank(a,b,result);
}
}
可以看到,上面核心的点还是,A 类 在调用 B 类方法时候,将自身引用 this 传给了B,让B在执行完成后,可以调用A类的方法。
还有一些更牛逼的写法:https://juejin.cn/post/6844904066129084429
网友评论