Java 回调函数详解

前言:

C语言中回调函数解释:

回调函数(Callback Function)是怎样一种函数呢?
函数是用来被调用的,我们调用函数的方法有两种:

直接调用:在函数A的函数体里通过书写函数B的函数名来调用之,使内存中对应函数B的代码得以执行。这里,A称为“主叫函数”(Caller),B称为“被叫函数”(Callee)。

间接调用:在函数A的函数体里并不出现函数B的函数名,而是使用指向函数B的函数指针p来使内存中属于函数B的代码片断得以执行——听起来很酷,是吧。

比起直接调用来,间接调用的确麻烦,那为什么还要使用间接调用呢?原因很简单——直接调用把函数名都写进函数体了,经过编译器那么一编译,板上钉钉,A注定调用的是B了,这样的程序只能按照程序员事先设计好的流程执行下去,太呆板了。此时,间接调用的巨大灵活性就显现出来了。想一想,如果p是函数A的一个参数(参数是变量,是变量就可以变吗!),那么程序的最终用户完全可以通过操作来改变p的指向——这样,A在通过p调用函数的时候就有机会调用到不同的函数,这样程序的实用性和扩展性就强多了。

在WINDOWS中,程序员想让系统DLL调用自己编写的一个方法,于是利用DLL当中回调函数(CALLBACK)的接口来编写程序,使它调用,这个就称为回调。在调用接口时,需要严格的按照定义的参数和方法调用,并且需要处理函数的异步,否则会导致程序的崩溃。这样的解释似乎还是比较难懂,这里举个简单的例子,程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序。程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法。目的达到。在C/C++中,要用回调函数,被掉函数需要告诉调用者自己的指针地址,但在JAVA中没有指针,怎么办?我们可以通过接口(interface)来实现定义回调函数。

正常情况下开发人员使用已经定义好的API,这个过程叫Call。但是有时这样不能满足需求,就需要程序员注册自己的程序,然后让事先定义好多API在合适的时候调用注册的方法,这叫CallBack。

“通常大家说的回调函数一般就是按照别人(李四)的定好的接口规范写,等待别人(张三)调用的函数,在C语言中,回调函数通常通过函数指针来传递;在Java中,通常就是编写另外一个类或类库的人(李四)规定一个接口,然后你(张三)来实现这个接口,然后把这个实现类的一个对象作为参数传给别人的程序,别人的程序必要时就会通过那个接口来调用你编写的函数。”

使用技巧:定一个接口,在接口中声明我们想调用的方法。

在另一个方法中注册刚定义的回调接口

第一步:定义回调接口

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

package com.callback;

 

/**

 *

 @since 2012-02-02

 *

 @desc 定义回调接口

 */

public interface CallBackInterface

 {

 

  public void doSome();

   

  public void exectueMethod();

}

第二步:李四编写的程序

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

package com.callback;

 

/**

 *

 @since 2012-02-02

 *

 @desc 李四

 */

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;

  }

}

  第三步:张三实现李四规定的接口

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

28

29

30

31

32

33

34

35

36

37

38

39

40

package com.callback;

 

/**

 *

 @since 2012-02-02

 *

 @desc 张三

 */

public class MethodA

 {

 

  public static void main(String

 args[]){

    MethodB

 b=new MethodB();

    //返回值d只和MethodB有关,和接口中方法的返回值无关

    double d=b.getTime(new CallBackInterface()

 {

       

      //张三实现了李四定义的接口

      public void exectueMethod()

 {

        new MethodA().testMethod();

      }

       

      @Override

      public void doSome()

 {

         

      }

    });

    System.out.println("d="+d);

  }

   

  public void testMethod(){

    for(int i=0;i<10000;i++){

      System.out.print("");

    }

  }

}

  输出结果:

1

2

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,安装后低层不知道这个回调的名字,但它通过一个函数指针来保存这个回调,在需要调用时,只需引用这个函数指针和相关的参数指针。

其实:回调就是该函数写在高层,低层通过一个函数指针保存这个函数,在某个事件的触发下,低层通过该函数指针调用高层那个函数。

Java 回调函数详解及使用相关推荐

  1. 函数指针与回调函数详解

    函数指针与回调函数详解 1.什么是函数指针? 函数(的)指针就是指针.这个指针存放一个函数的地址,而函数的名称就该函数的入口,即地址.这类似于数组名就是数组的首地址.我们可以通过反汇编直观的查看到函数 ...

  2. java jna 回调函数_JNA中级篇 回调函数详解

    JNI 技术是双向的,既可以从Java 代码中调用原生函数,也可以从原生函数中直接创建 Java 虚拟机,并调用Java 代码.但是在原生函数中调用java代码要写大量C代码,这对大多数java程序员 ...

  3. Java回调方法详解

    回调在维基百科中定义为: 在计算机程序设计中,回调函数,是指通过函数参数传递到其他代码的,某一块可执行代码的引用. 其目的是允许底层代码调用在高层定义的子程序. 举个例子可能更明白一些:以Androi ...

  4. java回调机制详解

    回调介绍 所谓回调,就是客户程序Client调用服务程序Service中的某个方法A,然后Service又在某个时候反过来调用Client中的某个方法B,对于Client来说,这个B便叫做回调函数. ...

  5. c语言timer linux 回调函数_C语言回调函数详解

    1. 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义.我在百度上搜了一下,发现众说纷纭,有很大一部分都是使用类 ...

  6. C 语言回调函数详解

    1. 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?网络上众说纷纭,有很大一部分都是使用类似这么一个场景来说明:A君去B君店里买东西,恰好缺货,A君留下号码给B ...

  7. php callback,php Callback 回调函数详解

    自 PHP 5.4 起可用 callable 类型指定回调类型 callback.本文档基于同样理由使用 callback 类型信息. 一些函数如 call_user_func() 或 usort() ...

  8. java strlen_strlen函数详解

    strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\0',如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到'\0'停止. char ...

  9. Java intern函数详解

    先看一个例子如果你会了那这篇文章你没必要看了,如果不会那请看下去,你一定会有收获: String s = new String("hello"); String str1 = s+ ...

最新文章

  1. PAT甲级1081 Rational Sum:[C++题解]分数求和、辗转相除法求最大公约数、long long有一个数据溢出
  2. 粘包的原因分析及解决
  3. JQuery 总结(1) 选择器的使用
  4. Dubbo 源码分析 - 自适应拓展原理
  5. [转载] 杜拉拉升职记——15 1001个笑话
  6. 消息 245,级别 16,状态 1,第 1 行 在将 varchar 值 '2,8' 转换成数据类型 int 时失败。...
  7. sklearn处理文本和分类属性的方式
  8. 计算机无法连接无线信号,win7系统连接无线信号时提示Windows无法连接到路由器名称的四种解决方法...
  9. c语言定义一个字母的范围,C语言学习知识程序设计试卷及其规范标准答案
  10. 如何通过三视图判断立方体个数_装机小白看过来:如何通过显卡参数来判断高端低端?...
  11. eclipse中mybatis generator插件的安装与使用,实现自动生成代码
  12. VSS 2005 配置简明手册
  13. HTTP代理如何使用
  14. adams2015怎么把工具栏打开_PDF怎么转成JPG?5个必备PDF操作技巧
  15. 详解 Kubernetes ReplicaSet 的实现原理
  16. Ios 公司申请苹果账号
  17. html图片绝对地址相对地址,HTML中background的图片地址是相对地址吗?
  18. Photoshop制作剔透魔法水晶球
  19. “猫爪杯”遭国人疯抢,“大白兔冰淇淋”在美国大火
  20. 安装win7-专业版虚拟机

热门文章

  1. 写一段vba代码,实现excel里数值升序排序
  2. Linux C之atio()函数
  3. Android Sutdios使用jni配置
  4. 专利技术CCD对位平台系统诞生——该平台不是UVW平台也不是XYθ平台
  5. 基于springboot+h5+websocket的即时通讯客服系统和百度实时语音转译(语音在线识别)
  6. Win7系统访问局域网-取消需要密码的方法
  7. Clojure 学习入门(6)—— 函数定义
  8. 条件语句之 if 语句
  9. idea ctrl+shift+数字
  10. java基础类库——java数据库编程,JDBC连接(原生数据库连接)(十)