posts - 93,  comments - 2,  trackbacks - 0
回调函数其实用起来比较简单,主要有三个部分
第一部分:定义一个接口用于回调;
如下所示:
public interface CallBackInterface {

     public void doSome();
     public void exectueMethod();
}

第二部分:在一个类里面把它当做参数并用到该参数
如下所示:

public class MethodB {

     public double getTime(CallBackInterface callBack){
          long start = System.currentTimeMillis();
          callBack.exectueMethod();
          long end = System.currentTimeMillis();
          System.out.println("cost time="+(end-start));
          return end-start;
     }
}

第三部分:在另外一个类里面调用到getTime方法并实现回调函数
如下所示:

public class MethodA {

     public static void main(String[] args) {
          MethodB b = new MethodB();
          double d = b.getTime(new CallBackInterface() {
         @Override
           public void exectueMethod() {
                // TODO Auto-generated method stub
                new MethodA().testMethod();
           }
   
           @Override
           public void doSome() {
                // TODO Auto-generated method stub
           }
          });
          System.out.println("d="+d);
     }
     public void testMethod(){
          for(int i=0;i<10000;i++)
           System.out.print("");
     }
}

输出结果:

cost time=31
d=31.0

理解“回调函数”

所谓回调,就是客户程序CLIENT调用服务程序SERVER中的某个函数SA,然后SERVER又在某个时候反过来调用CLIENT中的某个函数CB,对于CLIENT来说,这个CB便叫做回调函数。例如Win32下的窗口过程函数就是一个典型的回调函数。 
一般说来,CLIENT不会自己调用CB,CLIENT提供CB的目的就是让SERVER来调用它,而且是CLIENT不得不提供。由于SERVER并不知道CLIENT提供的CB叫甚名谁,所以SERVER会约定CB的接口规范(函数原型),然后由CLIENT提前通过SERVER的一个函数R告诉SERVER自己将要使用CB函数,这个过程称为回调函数的注册,R称为注册函数。Web SERVERerviCliente以及Java的RMI都用到回调机制,可以访问远程服务器程序。

下面举个通俗的例子:
某天,我打电话向你请教问题,当然是个难题,:),你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。故事到此结束。这个例子说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号码必须在以前告诉你,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。
通过上面个人感觉到回调函数更多的应用就是结合异步。比如:ajax中jServer通过组件和服务器的异步通信。

什么是回调函数

精妙比喻:回调函数还真有点像您随身带的BP机:告诉别人号码,在它有事情时Call您
回调用于层间协作,上层将本层函数安装在下层,这个函数就是回调,而下层在一定条件下触发回调,例如作为一个驱动,是一个底层,他在收到一个数据时,除了完成本层的处理工作外,还将进行回调,将这个数据交给上层应用层来做进一步处理,这在分层的数据通信中很普遍。
其实回调和API非常接近,他们的共性都是跨层调用的函数。但区别是API是低层提供给高层的调用,一般这个函数对高层都是已知的;而回调正好相反,他是高层提供给底层的调用,对于低层他是未知的,必须由高层进行安装,这个安装函数其实就是一个低层提供的API,安装后低层不知道这个回调的名字,但它通过一个函数指针来保存这个回调,在需要调用时,只需引用这个函数指针和相关的参数指针。

其实:回调就是该函数写在高层,低层通过一个函数指针保存这个函数,在某个事件的触发下,低层通过该函数指针调用高层那个函数。
【参考】
http://blog.csdn.net/sweetwxh/article/details/2067139
http://liutiemeng.blog.51cto.com/120361/18874
http://kidult.iteye.com/blog/148982

 

 

 




 

--

public static void main(String[] args) {
  MethodB b = new MethodB();
  double d = b.getTime(new CallBackInterface() {
   
   @Override
   public void exectueMethod() {
    // TODO Auto-generated method stub
    new MethodA().testMethod();
   }
   
   @Override
   public void doSome() {
    // TODO Auto-generated method stub
    
   }
  });
  System.out.println("d="+d);
 }
 public void testMethod(){
  for(int i=0;i<10000;i++)
   System.out.print("");
 }


 


posted on 2013-05-27 11:13 Terry Zou 阅读(148) 评论(0)  编辑  收藏 所属分类: Tomcat+Eclipse

只有注册用户登录后才能发表评论。


网站导航:
 
<2013年5月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

留言簿(2)

随笔分类

随笔档案

文章分类

文章档案

相册

收藏夹

Java

搜索

  •  

最新随笔

最新评论

阅读排行榜

评论排行榜