Java编程技巧-回调函数

背景:
开发公司项目的时候,需要用到Jenkins触发编译,打包APK,随后拿到产物地址再进行下一步,但是APK编译时间不确定,但是检测又必须拿到这个产物地址才能进行。

1. 回调

1.1. 同步回调

比如:你去书店买书,进门问老板有书吗?老板说有,同时给你拿出了书,随后,你付钱离开。这一过程,整个流程:

  1. 询问
  2. 等老板给你拿书
  3. 拿到书付钱离开

fun(a)调用fun(b)fun(a)等待fun(b)执行完后再进行下一步。

同步调用会引起代码的阻塞。

1.2. 异步回调

比如:你还是去买书,询问老板有书吗?老板说我去找一下,你回复说那你先找吧,我先去喝一杯奶茶去,我过一会人再来。过了一个小时,老板已经将书放在柜台,你付钱离开。整个过程:

  1. 询问
  2. 老板去招书
  3. 你去喝奶茶
  4. 得到书,付钱离开

fun(a)调用fun(b), fun(a)不等待fun(b)执行完便进行下一步。
常见的有Thread、Task等。

1.3. 回调

比如:你接着去买书,询问老板有书吗?老板说目前没有,然后你回答说,那我在这儿等,书来了我才走。后面有书了,你得到了书付钱离开。整个过程:

  1. 询问
  2. 老板备货
  3. 等待
  4. 得到书,付钱离开

回调的机制是:

  1. 类A的a()方法调用类B的b()方法
  2. 类B的b()方法执行完毕主动调用类A的callback()方法

所以在回调,重要的就是两个类:

A:调用B后,需要等到B的结果才能继续向下执行。

B:执行动作。

设置回调,由于A是需要等到B的结果再向下,所以在A中,需要实现这个接口,或者在调用B方法的参数中,实例化一个Callback对象,B中持有这个回调对象,当B完成之后,就通过这个回调对象发消息。

比如买书:

用户需要等书才走,书店老板要备货,那么用户就是A,书店(老板)就是B,用户需要实现一个回调,并且书店要持有这个回调,当备货完成才能通知用户。

回调:

1
2
3
public interface BookAvailableCallback {
void onBookAvailable(String bookTitle);
}

用户:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class User {

public void buyBook() {
System.out.println("去书店买书");
BookStore bookStore = new BookStore();
bookStore.prepareBook(new BookAvailableCallback() {
@Override
public void onBookAvailable(String bookTitle) {
System.out.println("买到了书---《" + bookTitle + "》");
}
});
}
}

书店:

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
public class BookStore {
private BookAvailableCallback callback;


public void prepareBook(BookAvailableCallback callback) {
this.callback = callback;
try {
System.out.println("书店正在备货,请稍候...");
TimeUnit.SECONDS.sleep(5); // 模拟备货过程,等待5秒
} catch (InterruptedException e) {
e.printStackTrace();
}

haveBook();


}

private void haveBook() {
String bookTitle = "Java Programming"; // 模拟书店有了书

// 当书店有书时,调用回调通知用户
if (callback != null) {
callback.onBookAvailable(bookTitle);
}
}
}

测试:

1
2
3
4
5
6
7
8
public class Main {
public static void main(String[] args) {
BookStore bookStore = new BookStore();
User user = new User();

user.buyBook();
}
}

其实回调就是一个很好的面向接口编程的实例,在接口中定义好要做什么事,根据接口定义的职责,实例出来的对象就具备这个接口能力,那么只需要在另一边持有对应的引用就可以通过回调定义的能力将最终结果返回。


Java编程技巧-回调函数
https://baijianglai.cn/Java编程技巧-回调函数/12bcfab4b0fb/
作者
Lai Baijiang
发布于
2023年10月26日
许可协议