Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1448281
  • 博文数量: 254
  • 博客积分: 8696
  • 博客等级: 中将
  • 技术积分: 2961
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-03 16:46
文章分类

全部博文(254)

文章存档

2015年(4)

2014年(18)

2013年(16)

2012年(8)

2011年(25)

2010年(2)

2009年(74)

2008年(107)

分类: Java

2009-03-02 16:21:01

   熟悉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调用。
(转载:)
阅读(854) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~