熟悉MS-Windows和XWindowSystem事件驱动编程模型的开发人员,习惯于传递在某种事件发生时调用(即“回调”)的函数指针。Java的面向对象模型目前并不支持方法指针,这样似乎就不可能使用这种很好的机制。但我们并不是一点办法都没有!
Java的接口支持提供了一种获得回调的等价功能的机制。其技巧就是:定义一个简单接口,并在该接口中声明我们要调用的方法。
例如,假定我们希望在某个事件发生时得到通知。我们可以定义一个接口:
public interface InterestingEvent
{
//这仅是一个常规方法。因此如果需要,
//它可有返回值,也可接收参数。
public void interestingEvent();
}
这使得我们可以控制实现该接口的类的任何对象。因此,我们不必关心任何外部类型信息。与在将C++代码用于Motif时使用窗口小部件的数据域来容纳对象指针的难以控制的C函数相比,这种方法要好得多。
发出事件信号的类必须等待实现了InterestingEvent接口的对象,并在适当时候调用interestingEvent()方法。
public class EventNotifier
{
private InterestingEvent ie;
private boolean somethingHappened;
public EventNotifier(InterestingEvent event)
{
//保存事件对象以备后用。
ie=event;
//还没有要报告的事件。
somethingHappened = false;
}
//...
publicvoiddoWork()
{
//检查在别处设置的谓词。
if(somethingHappened)
{
//通过调用接口的这个方法发出事件信号。
ie.interestingEvent();
}
//...
}
//...
}
在上例中,我使用somethingHappened谓词来跟踪是否应触发事件。在许多情况下,调用此方法足以保证向interestingEvent()发出信号。
希望接收事件通知的代码必须实现InterestingEvent接口,并将自身引用传递给事件通知程序。
public class CallMe implements InterestingEvent
{
private EventNotifier en;
public CallMe()
{
//创建事件通知程序,并将自身引用传递给它。
en = new EventNotifier(this);
}
//为事件定义实际的处理程序。
public void interestingEvent()
{
//噢!必定发生了感兴趣的事件!
//执行某些操作...
}
//...
}
(转载:)
补充--回调函数
Callback Function
什么是回调函数?
回调函数是应用程序提供给Windows系统DLL或其它DLL调用的函数,一般用于截获消
息、获取系统信息或处理异步事件。应用程序把回调函数的地址指针告诉DLL,而DLL在适当的时候会调用该函数。回调函数必须遵守事先规定好的参数格式和
传递方式,否则DLL一调用它就会引起程序或系统的崩溃。通常情况下,回调函数采用标准WindowsAPI的调用方式,即__stdcall,当
然,DLL编制者可以自己定义调用方式,但客户程序也必须遵守相同的规定。在__stdcall方式下,函数的参数按从右到左的顺序压入堆栈,除了明确指
明是指针或引用外,参数都按值传递,函数返回之前自己负责把参数从堆栈中弹出。
理解回调函数!
程序在调用一个函数(function)时(通常指api).相当于程序(program)呼叫(Call)了一个函数(function)关系表示如下:
call(调用)
program --------------------→ dll
程序在调用一个函数时,将自己的函数的地址作为参数传递给程序调用的函数时(那么这个自己的函数称回调函数).需要回调函数的 DLL 函数往往是一些必须重复执行某些操作的函数.关系表示如下:
call(调用)
program --------------------→ dll
↑ ¦
¦_______________________________¦
callback(回调)
当你调用的函数在传递返回值给回调函数时,你就可以利用回调函数来处理或完成一定的操作。至于
如何定义自己的回调函数,跟具体使用的API函数有关,很多不同类别的回调函数有各种各样的参数,有关这些参数的描述一般在帮助中有说明回调函数的参数和
返回值等.其实简单说回调函数就是你所写的函数满足一定条件后,被DLL调用!
也有这样的说法(比较容易理解):
回调函数就好像是一个中断处理函数,系统在符合你设定的条件时自动调用。为此,你需要做三件事:
1. 声明;
2. 定义;
3. 设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为一个参数,以便于DLL调用。
(转载:)
阅读(889) | 评论(0) | 转发(0) |