回调机制 java的回调机制

所谓回调,定义是“一个方法的指针传递给事件源,当某一事件发生时用来调用这个方法。”

比如客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数。例如Win32下的窗口过程函数就是一个典型的回调函数。一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C不得不提供。由于S并不知道C提供的B姓甚名谁,所以S会约定B的接口规范(函数原型),然后由C提前通过S的一个函数A告诉S自己将要使用B函数,这个过程称为回调函数的注册,A称为注册函数。

总的来说,回调函数就是那些自己写的,但是不是自己来调,而是给别人来调的函数。

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

消息响应函数就可以看成是回调函数,因为是让系统在合适的时候去调用。只不过消息响应函数就是为了处理消息的,所以就拿出来单做一类了。其实本质上就是回调函数。但是回调函数不是只有消息响应函数一种,比如在内核编程中,驱动程序就要提供一些回调函数,当一个设备的数据读写完成后,让系统调用这些回调函数来执行一些后续工作。
回调机制 java的回调机制

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

C语言中回调函数解释:

我们调用函数的方法有两种:

直接调用:在函数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中,通常就是编写另外一个类或类库的人(李四)规定一个接口,然后你(张三)来实现这个接口,然后把这个实现类的一个对象作为参数传给别人(例如王五)的程序,王五的程序必要时就会通过那个接口来调用你编写的函数。


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

java回调机制:

软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。

同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;

回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;

异步调用:一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。

回调和异步调用的关系非常紧密:使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。

用Java里的例子:

public interface ICallBack//接口,规范需要有的函数

{

public void postExec();//需要回调的方法

}

另外的一个类:

public class FooBar

{ private ICallBackcallBack;

public voidsetCallBack(ICallBack callBack)

{

this.callBack = callBack;

doSth();

}

public voiddoSth()

{

callBack.postExec(); //调用回调函数

}

}

第二个类在测试类里面,是一个匿名类:

public class Test

{

public static void main(String[] args)

{

FooBar foo = new FooBar();

foo.setCallBack(new ICallBack() {

public void postExec()

{

System.out.println("在Test类中实现但由FooBar对象调用");

}实现了IcallBack接口的匿名类。

});

}

}

上诉的代码:

1.两个类:匿名类和FooBar

2.匿名类实现接口ICallBack(在test测试的main方法中用匿名类的形式实现)

3.FooBar拥有一个参数为ICallBack接口类型的函数setCallBack(ICallBack)

4.匿名类运行时调用FooBar中setCallBack函数,以自身传入参数

5.FooBar已取得匿名类,就可以随时回调匿名类中所实现的ICallBack接口中的方法


假设有接口名为ICallBack 其中有方法名为postExec()。有类Myclass 实现了该接口,也就是一定实现了postExec()这个方法。现在有另一个类FooBar它有个方法setCallBack(ICallBack callBack),并且setCallBack方法调用了callBack的postExec()方法。
如果现在,我们使用一个Myclass 的实例myClass,将它作为参数带入到setCallBack(ICallBackcallBack)方法中,我们就说setCallBack(ICallBackcallBack)方法回调了myClass的postExec()方法。

  

爱华网本文地址 » http://www.413yy.cn/a/25101014/229889.html

更多阅读

eclipse中svn插件的安装 eclipse的svn插件安装

eclipse中svn插件的安装——简介Svn(Subversion)是近年来崛起的版本管理工具,在当前的开源项目里(J2EE),几乎95%以上的项目都用到了SVN。Subversion项目的初衷是为了替换当年开源社区最为流行的版本控制软件CVS,在CVS的功能的基础上有很

win7下如何安装JDK win7 安装多个jdk版本

win7下如何安装JDK——简介学习java的新手,都是要从安装jdk开始的,就会遇到配置jdk变量环境,这对新手来说是个头疼的事情,下面就给大家来说下,怎么安装java jdk及配置jdk变量环境。win7下如何安装JDK——win7下安装JDK的步骤:win7下如何

aapt.exe停止工作如何解决 aapt.exe停止工作

aapt.exe停止工作如何解决——简介在使用eclipse进行安卓java的编程的时候,有时候我们会遇到这样的问题:那就是无故弹出aapt.exe停止工作的提示,虽然程序不会崩溃,但是这个提示经常弹出很是烦人。今天,小编就来教大家aapt.exe停止工作如

如何把Teamcenter变成英文界面 steam界面变成英文

虽然我们可以在java 的运行参数中通过设置参数-Duser.language=en_US,把显示设置为英文界面,但是这样导致我们没有办法输入中文。在2层的richclient端可以通过下面的方式把界面改为英文,但同时可以输入中文1) BMIDE : 修改 %TC_ROOT%m

Tomcat安装及配置教程 tomcat怎么下载安装

Tomcat安装及配置教程——简介用来进行web开发的工具有很多,Tomcat是其中一个开源的且免费的java Web服务器,是Apache软件基金会的项目。电脑上安装配置Tomcat的方法和java有些相同,不过首先需要配置好java的环境才行。Tomcat安装及配

声明:《回调机制 java的回调机制》为网友十公里的艳遇分享!如侵犯到您的合法权益请联系我们删除