废话不多说,像许多网上介绍回调机制的文章一样,我这里也以一个现实的例子开头:假设你公司的总经理出差前需要你帮他办件事情,这件事情你需要花些时间去做,这时候总经理肯定不能守着你做完再出差吧,于是就他告诉你他的手机号码叫你如果事情办完了你就打电话告诉他一声;这是一个现实生活中常能碰到的例子,我们用呢就用代码的方式来实现一个这个过程,看一下这个过程究竟是怎样的。
程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序。程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法。目的达到。
假设我是程序员A,以下是我的程序a:
public class Caller {
public MyCallInterface mc;
public void setCallfuc(MyCallInterface mc){
this.mc= mc;
}
public void call(){
this.mc.method();
}
}
我还需要定义一个接口,以便程序员B根据我的定义编写程序实现接口。
public interface MyCallInterface {
public void method();
}
于是,程序员B只需要实现这个接口就能达到回调的目的了:
public class B implements MyCallInterface {
public void method() {undefined
System.out.println("谁来调用我啊。好寂寞!!");
}
public static void main(String args[]) {
Caller call = new Caller();
call.setCallfuc(new B());
call.call();
}
}
所谓回调,就是客户程序C调用服务程序S中的某个方法a,然后S又在某个时候反过来调用C中的某个方法b,对于C来说,这个b便叫做回调函数。
一般说来,C不会自己调用b,C提供b的目的就是让S来调用它,而且是C不得不提供。由于S并不知道C提供的b叫甚名谁,所以S会约定b的接口规范(函数原型),然后由C提前通过S的一个函数r告诉S自己将要使用的b函数,这个过程称为回调函数的注册,r称为注册函数。
声明一个接口,另外一个类有方法里面有个参数以是这个接口类型的,而后在另外类中实现这个接口(java中多用的是匿名内部类),而且以这个匿名的类生成的对象为参数传到上面提到类中,而后实现回调.......这种用法可以参考java里面常用到的数据库操作所用到的几个接口.....
//声明一个接口
public interface ICallBack {undefined
void postExec();
}
//另外一个类有方法里面有个参数以是这个接口类型的
public class FooBar {undefined
private ICallBack callBack;
public void setCallBack(ICallBack callBack) {undefined
this.callBack = callBack;
}
public void doSth() {undefined
callBack.postExec();
}
}
----------------------------------------
回调的实现
public class Test {undefined
public static void main(String[] args) {
FooBar foo = new FooBar();
foo.setCallBack(new ICallBack() {
public void postExec() {
System.out.println("method executed.");
}
});
foo.doSth();//调用类FooBar的函数,在函数里再调用回调函数
}
}