Java回调机制

回调函数可以使得工作流更加灵活。回调机制是一种常见的设计模型,它在工作流中将某个功能按照约定的接口提供给用户,由用户实现这部分功能,由工作流决定回调时机。

回调机制分为两步:回调函数注册回调

  • 回调函数注册:首先,假设 class A提供一个工作流,在该工作流中有个方法a可由用户实现,于是class A规定了接口i,在接口中告诉用户去实现方法a。这时候来了一个用户class C需要使用class A的工作流,class C实现了a方法。
  • 回调:class C调用了class A的工作流,在执行a方法时,其实回调了自己实现的a方法。

举例

class A中提供一个方法testTime(工作流),计算某个给定方法的执行时间。计算的方法可以由用户指定。此时有一个用户class C,需要调用class A的testTime来计算自己的方法testMethod执行时间

首先定义接口,将回调的功能单独抽离,并在接口中提供方法a,计算方法可以放到a中,实现调用:

1
2
3
public interface CallBack{
public void a();
}

定义class C,其中有需要测试执行时间的方法testMethod

1
2
3
4
5
6
7
8
public class C{
public static void testMethod(
int sum=0;
for(int i=0;i<10000;i++){
sum =sum+i;
}
}
}

然后定义class A,其中有计算执行时间的方法testTime。

1
2
3
4
5
6
7
8
public class A {
public void testTime(CallBack cb){
long beginTime = System.currentTimeMillis();
cb.a();
long endTime = System.currentTimeMillis();
System.out.println("[use time]:" + (end - begin)); //打印a执行时间
}
}

然后在main中通过回调完成工作流

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class A {
public void testTime(CallBack cb){
long beginTime = System.currentTimeMillis();
cb.a();//进行回调
long endTime = System.currentTimeMillis();
System.out.println("[use time]:" + (end - begin)); //打印a执行时间
}

public static void main(String[] args){
A tool = new A();
tool.testTime(new CallBack(){
public void a(){
//注册回调函数
C.testMethod();
}
});
}
}

Android中的回调方法

Android中大部分以on开头的API都是回调方法,比如onClickListener

1
2
3
4
5
6
7
8
9
10
11
12
Button.setOnClickListener(new OnClickListener(){
public void onClick(){
...
}
})

// 对比 上文
tool.testTime(new CallBack(){
public void a(){
//注册回调函数
C.testMethod();
}

Android系统开发者定义好接口和方法,Android应用开发者实现具体的方法,并通过回调机制来调用自己的方法,完成整个工作流。

参考文章