Java 回调函数
基本介绍
- 回调函数:回调函数是功能片段,由用户按照回调函数调用约定来实现的一个函数。是工作流的一部分,由工作流来决定函数的调用(回调)时机。
- 回调机制:是一种常见的设计模型,他把工作流内的某个功能,按照约定的接口暴露给外部使用者,为外部使用者提供数据,或要求外部使用者提供数据。
- 回调的思想:实现双向调用,类A的a方法调用类B的b方法,类B的b方法执行完毕主动调用类A的callback()。?关键是:回调方将本身即this传递给调用方
- 回调实现了类与类之间的通信。
举个例子
双向调用
模拟人排队吃饭,阿姨决定通知人是否开饭。
1⃣️ 在接口定义回调函数openRice
public interface IEat {
void openRice(String msg);
}
2⃣️ People类实现接口,并且将自身引用传给Aunt类
?注意:希望接收事件通知的类必须要实现IEat接口,而且要把自己的引用传递给事件的通知者。
public class People implements IEat {
private Aunt aunt;
public void start() {
aunt = new Aunt(this); // 2
}
@Override
public void openRice(String msg) {
// 5
System.out.println(msg);
}
}
3⃣️ Aunt类调用传过来的引用
?此处的Aunt类作为通知方,将传过来的引用调用其函数。
public class Aunt {
private IEat mEat;
public Aunt(IEat mEat) {
this.mEat = mEat; // 3
getRice(); // 3
}
public void getRice() {
// PS:此处可以另开线程防止阻塞
try {
System.out.println("排队中");
Thread.sleep(3000);
System.out.println("到你啦");
} catch (InterruptedException e) {
e.printStackTrace();
}
mEat.openRice("开饭了"); //4
}
}
4⃣️测试类
public class Main {
public static void main(String[] args) {
People people = new People();
System.out.println("开始排队");
people.start(); //1
}
}
输出:
开始排队
排队中
到你啦
开饭了
总体实现的流程为:
暴露接口
类似于Button的点击事件. 参考https://www.jianshu.com/p/67190bdce647
一个打印机,还有一个人,打印机具有打印的功能,但是打印需要时间,不能在收到任务的同时给出反馈,需要等待一段时间才能给出反馈。这个人想做的就是打印一份简历,然后知道打印的结果。这里面代码实现了这两种方式。
1⃣️ 定义回调函数
public interface Callback {
void printFinished(String msg);
}
2⃣️ 定义打印机类
public class Printer {
public void print(Callback callback, String text) {
System.out.println("正在打印");
try {
Thread.sleep(3000);
} catch (Exception e) {
}
callback.printFinished("打印完成"); //3
}
}
3⃣️ 定义People类
public class People {
Printer printer = new Printer();
/*
* 同步回调
*/
public void goToPrintSyn(Callback callback, String text) {
printer.print(callback, text);
}
/*
* 异步回调
*/
public void goToPrintASyn(Callback callback, String text) {
new Thread(new Runnable() {
public void run() {
printer.print(callback, text); //2
}
}).start();
}
}
4⃣️ 测试类
public class Main {
public static void main(String[] args) {
People people = new People();
System.out.println("需要打印的内容是 ---> " + "打印一份简历");
people.goToPrintASyn(new Callback() { //1
@Override
public void printFinished(String msg) {
System.out.println("打印机告诉我的消息是 ---> " + msg); //4
}
}, "打印一份简历");
System.out.println("我在等待 打印机 给我反馈");
}
}
输出结果:
需要打印的内容是 ---> 打印一份简历
正在打印
我在等待 打印机 给我反馈
打印机告诉我的消息是 ---> 打印完成
总体流程:
实际开发中
实际开发中遇到使用回调的情况
占坑