`
isiqi
  • 浏览: 16651019 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

用 Java 实现回调例程

阅读更多
熟悉 MS-Windows 和 X Window System 事件驱动编程模型的开发人员,习惯于传递在某种事件发生时调用(即“回调”)的函数指针。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;
}

//...

public void doWork ()
{
// 检查在别处设置的谓词。
if (somethingHappened)
{
// 通过调用接口的这个方法发出事件信号。
ie.interestingEvent ();
}
//...
}

// ...
}


在上例中,我使用 somethingHappened 谓词来跟踪是否应触发事件。在许多情况下,调用此方法足以保证向 interestingEvent() 发出信号。

希望接收事件通知的代码必须实现 InterestingEvent 接口,并将自身引用传递给事件通知程序。

public class CallMe implements InterestingEvent
{
private EventNotifier en;

public CallMe ()
{
// 创建事件通知程序,并将自身引用传递给它。
en = new EventNotifier (this);
}

// 为事件定义实际的处理程序。
public void interestingEvent ()
{
// 噢!必定发生了感兴趣的事件!
// 执行某些操作 ...
}

//...
}
分享到:
评论

相关推荐

    JAVAHTTP例程

    例如,使用`CompletableFuture`配合`HttpURLConnection`或使用OkHttp的回调函数。 7. **上传/下载文件**:HTTP协议支持大文件的上传和下载。使用`HttpURLConnection`或第三方库,你可以通过设置合适的请求头和使用...

    《Java编程思想_第4版》例程集合,包含数组、bignumber、接口回调(仿butto

    《Java编程思想_第4版》例程集合,包含数组、bignumber、接口回调(仿button监听事件_ThinkingInJava

    Unity3D_嵌入移动MM支付sdk例程

    这个Eclipse工程包含支付SDK的Java库、Activity、BroadcastReceiver等,它们负责处理支付流程,如初始化SDK、调起支付界面、接收支付结果回调等。开发者需要将此工程与Unity的Android导出项目链接,通常是通过AAR...

    android gps例程

    LocationListener有四个方法:onLocationChanged、onProviderDisabled、onProviderEnabled和onStatusChanged,分别对应位置改变、GPS关闭、GPS开启和状态变化时的回调。 ```java LocationListener locationListener...

    菜单操作例程.rar

    编程中,我们需要为这些事件编写处理函数或回调函数,以执行相应的操作。例如,点击"退出"菜单项时,程序会调用关闭程序的函数。 3. **菜单操作例程**:这是处理菜单事件的核心代码,通常包括了创建菜单、添加菜单...

    vtd-xml源码+例程

    DOM将整个XML文档加载到内存中形成一棵树形结构,而SAX是事件驱动的解析方式,只在遇到特定元素时触发回调函数。VTD则采取了一种折衷的方式,它将XML文档分割成一系列可变长度的标记,这些标记可以被快速定位和访问...

    android语音识别例程

    该接口包含了几个回调方法,如`onResults(Bundle results)`用于接收识别结果,`onError(int error)`用于处理错误情况。 5. **permissions**:为了使用语音识别功能,我们需要在AndroidManifest.xml文件中添加相应的...

    android拍照例程

    配置好UseCase后,只需添加到`Lifecycle`中即可开始使用,拍照操作则通过`takePicture()`的回调来处理。 在压缩包中的"takePhoto"文件可能是Java源代码文件或资源文件。源代码文件可能包含了启动相机、处理拍照结果...

    安卓app开发,webview例程,包含2个webview,并且含有创建线程例程

    此外,为了优化用户体验,开发者可能还会使用WebViewClient和WebChromeClient这两个回调接口,分别处理页面加载事件和提供UI反馈。 接下来,我们讨论线程的创建。在Android中,主线程(UI线程)负责处理用户界面的...

    易安卓E4A免签免类库聚合支付系统例程

    4. `说明.txt`:提供有关如何使用和配置这个支付系统的详细说明,包括可能的参数设置、调用方法和回调处理等。 通过这个例程,开发者可以快速掌握在E4A环境中集成聚合支付的方法,无论是初学者还是经验丰富的开发者...

    串口数据实时采集显示例程

    当接收到数据时,通常会触发一个回调函数,处理接收到的数据。数据采集过程中,我们需要注意线程同步,确保数据处理不会阻塞串口读取,可以使用多线程或异步编程模型来实现。 在描述中提到的"APP函数"可能指的是...

    CefDemo例程

    6. **回调和事件处理**:`CEF`提供了丰富的回调接口,如`CefLifeSpanHandler`、`CefLoadHandler`等,用于处理窗口生命周期、页面加载事件等。通过这些回调,你可以监听并响应用户行为或程序内部事件。 在`CefDemo`...

    数据库填充到树型框例程.e.rar

    6. **编程语言和框架**:这个例程可能是用特定编程语言实现的,如C#、Java或Python,每个语言都有对应的GUI库或框架,例如.NET Framework、JavaFX或Qt。 7. **事件驱动编程**:当用户在树型框中进行操作(如点击、...

    三个android语音识别例程mystt.zip

    在`onResults`回调中,我们可以得到用户的语音输入文本。 `mystt2`可能是在`mystt1`基础上进行了优化或增加了额外功能。例如,它可能支持了离线语音识别,这在没有网络连接或者网络不稳定的情况下非常有用。Android...

    Android安卓经典设计例程源代码-ProgressDialogSample.rar

    Android现在推荐使用Kotlin的协程或者Java 8的CompletableFuture等现代异步编程工具,这些可以更优雅地管理任务和界面更新,同时避免回调地狱。 综上所述,"Android安卓经典设计例程源代码-ProgressDialogSample...

    火山安卓高级刷新容器刷新加载演示例程.rar

    火山安卓库可能提供了一种简单的方法来实现这一功能,包括自定义刷新动画和回调机制。 2. **上拉加载更多(Load More)**: 当用户滚动到列表底部时,自动加载更多数据。这对于显示无限制或大量数据的列表特别有用,...

    完整版对象用法大全(常用对象应用)例程.rar

    12. **对象间的交互**:对象可以通过方法调用来相互作用,实现功能的组合和协作。 这个压缩包中的“对象用法大全(常用对象应用)例程”很可能是通过实际代码示例来展示上述概念的运用。学习这些例程,可以帮助你更...

    Android安卓经典设计例程源代码-ProgressBarSample.rar

    - 当执行耗时操作(如网络请求或文件读写)时,通常会在后台线程进行,并通过`AsyncTask`或其他回调机制(如`Handler`或`LiveData`)更新主线程中的ProgressBar。 4. **Infinite ProgressBar**: - 用于显示无限...

    Android蓝牙程序实例

    当有客户端连接时,服务器会回调`accept()`方法,返回一个新的`BluetoothSocket`,此时就可以进行数据交换了。 此外,Android Bluetooth API还支持低功耗蓝牙(BLE,Bluetooth Low Energy),适用于那些需要长时间...

    android eclips 串口例程

    - 设置数据接收和错误处理回调。 5. **实现串口读写** - 创建一个线程或Handler来处理串口的读写操作,避免阻塞UI线程。 - 实现`SerialPort`的`read()`方法来接收数据,`write()`方法来发送数据。 - 示例代码...

Global site tag (gtag.js) - Google Analytics