在计算机程序设计中,回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。如把一个方法的指针传递给事件源,当某一事件发生时来调用这个方法
在java中没有方法指针,但是可以用接口Interface来代替。
caller需要调用method这一方法,但是caller又不负责实现它。比如caller(FileOperationer对象负责操作文件,比如删除、复制)的call方法(delete函数)里发生了某事件(删除文件成功),该事件发生则要调用method(删除文件成功要调用onSuccess来完成别的功能,比如刷新列表),但是method方法不应该由caller来实现(将要完成的功能刷新列表跟操作文件没关系,不应该由FileOperationer实现),应该由callee来实现(刷新列表属于改变视图,应该由FileViewManager类来实现)。
1,我们声明一个接口Interface ICallback (IFileOperationListener),其中有一个方法叫做method(onSuccess)
public interface ICallback {
void method();
}
2,Callee负责实现它
public class Callee implements ICallback {
public void method(){
}
}
3,Caller注册Callee
Caller声明一个私有成员接口ICallback,然后在注册函数里通过函数参数将接口实现类Callee传递进来
public class Caller {
private ICallback mCallback; //私有接口成员
public void setCallback(ICallback callback) {
this.mCallback = callback; //接口成员的实现:从外部传入
}
}
4,Caller的某个方法会使用method方法
public void fuc() {
...
mCallback.method();
}
5,Caller的实例先注册回调函数再使用它
Caller caller = new Caller();
caller.setCallback(new Callee());
caller.fuc();
Callee(FileViewManager)是高层,Caller(FileOperationer)是底层。通过回调,底层调用了在高层定义的子程序。
一般程序的写法是高层调用底层,底层回调高层的个别代码。类似于
callee是指挥中心
callee分配任务给caller,和caller约定好caller完成任务后打电话回来好让callee执行后续代码
Caller完成了任务然后打电话回调callee执行接下来的method
callee正在执行后续代码method
所以上述过程也可以这么写:
public class MainTest {
/**
* @param args
*/
public static void main(String args[]){
Callee callee=new Callee();//初始化指挥中心
callee.assignTask();//指挥中心分配任务
}
}
public class Callee implements ICallback {
private Caller mCaller;
public Callee(){
mCaller=new Caller(this);
}
public void method(){
System.out.println("callee正在执行后续代码method");
}
public void assignTask() {
System.out.println("callee分配任务给caller,和caller约定好caller完成任务后打电话回来好让callee执行后续代码");
mCaller.call();
}
}
public class Caller {
private ICallback mCallback; // 私有接口成员
public Caller(ICallback callback) {
this.mCallback = callback;
}
public void call() {
System.out.println("Caller完成了任务然后打电话回调callee执行接下来的method");
mCallback.method();
}
public interface ICallback {
void method();
}
}