Java 程式設計 -- Callback 與 Listener 機制

本文通过实例详细介绍了Java中Listener机制的工作原理,演示了如何使用Listener实现事件监听和回调功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:《http://ccckmit.wikidot.com/ja:listener


專案下載:Listener.zip

簡介

在 Java 當中沒有像 C# 當中的委派 (delegate) 語法,所有的委派任務都交由一種稱為 Listener 的物件完成,其實作方法乃是利用 Register - Callback 的反向呼叫機制,為了說明這個機制的原理,我們撰寫了以下的程式,以便說明 Listener - Callback 的實作原理。

程式範例

檔案:Listener.java

interface Listener {
      void onEvent(String str);
}

檔案:EventListener.java

public class EventListener implements Listener {
    String name;
    public EventListener(String name) {
        this.name = name;
    }
    public void onEvent(String str) {
        System.out.println(name+":"+str);
    }
}

檔案:Callback.java

import java.util.*;
 
public class Callback {
  List<Listener> listeners = new ArrayList<Listener>();
 
  public static void main(String[] args) {
      Callback callback = new Callback();
      callback.addListener(new EventListener("Listener 1"));
      callback.addListener(new EventListener("Listener 2"));
      callback.addListener(new EventListener("Listener 3"));
      callback.trigger("Hello!");
      callback.trigger("你好!");
  }
 
  public void addListener(Listener listener) {
      listeners.add(listener);
  }
 
  public void trigger(String msg) {
      for (int i=0; i<listeners.size(); i++) {
          listeners.get(i).onEvent(msg);
      }
  }
}

執行結果

Listener 1:Hello!
Listener 2:Hello!
Listener 3:Hello!
Listener 1:你好!
Listener 2:你好!
Listener 3:你好!

<think>嗯,用户想了解Java中接口回调的使用方法和示例。让我先回顾一下接口回调的基本概念。接口回调是一种允许类之间进行双向调用的机制,通常用于实现事件处理、异步任务等场景。根据用户提供的引用,比如引用[1]中提到类A调用类B的方法,然后类B再回调类A的方法,这需要定义一个接口,并由类A实现该接口的方法。 首先,我需要解释接口回调的基本原理。接口回调的核心在于定义一个回调接口,其中声明需要被调用的方法。然后,调用方(例如类A)实现这个接口,并将自身传递给被调用方(例如类B)。当特定事件发生时,被调用方通过接口调用实现的方法,完成回调过程。 接下来,我应该给出一个具体的示例,帮助用户理解。比如,引用[4]中提到的按钮点击事件处理,这是一个典型的回调应用场景。可以创建一个ClickHandler接口,包含handleClick方法。然后,Button类持有该接口的引用,并在点击时调用handleClick。主类实现这个接口并注册给Button,这样点击按钮时就会触发回调。 另外,用户提供的引用中有多个代码示例,比如引用[2]和引用[3]中的代码片段。需要确保示例的正确性,比如在类B中设置回调监听器,并在适当的时候触发回调方法。同时,要注意Java语法,比如接口的定义、实现和调用方式。 用户可能还关心异步任务中的回调使用,比如网络请求完成后通知调用方。这时候可以举例AsyncTask类,在doInBackground执行耗时任务,然后在onPostExecute中通过回调更新UI。这部分需要结合Android开发的实际案例,但用户的问题可能更偏向基础Java,所以可能需要区分场景。 需要检查是否有常见的错误或注意事项需要提醒用户,比如确保回调接口不为空,避免内存泄漏等。此外,接口回调观察者模式的区别和联系也是一个可能的扩展点,但用户的问题可能更关注基础使用方法,所以暂时不需要深入。 最后,根据用户提供的引用,特别是引用[1]中的类图说明,可以强调接口回调的双向调用过程,即类A调用类B的方法,而类B通过接口回调类A的方法。这种解耦方式提高了代码的灵活性和可维护性。 总结一下,回答的结构应该是先介绍原理,再分步骤说明使用方法,提供经典示例(如按钮点击),并给出异步任务的例子,最后总结注意事项和应用场景。同时,确保代码示例符合用户提供的引用内容,并正确使用LaTeX格式和引用标识。</think>### Java接口回调使用方法详解 接口回调是一种通过接口实现的双向调用机制,核心原理是调用方将自身引用传递给被调用方,通过接口方法实现反向调用。以下是具体实现步骤: #### 一、核心实现步骤 1. **定义回调接口** 声明包含回调方法的接口,所有回调逻辑通过接口方法实现 ```java public interface CallbackInterface { void onComplete(String result); // 标准回调方法命名建议用on开头 } ``` 2. **被调用方持有接口引用** 接收并存储回调接口实例,在特定事件触发时调用 ```java public class Worker { private CallbackInterface callback; public void setCallback(CallbackInterface cb) { this.callback = cb; // 通过setter注入回调对象[^2] } public void doTask() { // 模拟耗时操作 String data = "处理结果"; if(callback != null) { callback.onComplete(data); // 任务完成后触发回调[^4] } } } ``` 3. **调用方实现接口方法** 实现具体回调逻辑,并将自身实例传递给被调用方 ```java public class Main implements CallbackInterface { public static void main(String[] args) { Main main = new Main(); Worker worker = new Worker(); worker.setCallback(main); // 注册回调对象[^1] worker.doTask(); } @Override public void onComplete(String result) { System.out.println("收到回调结果: " + result); // 实际处理逻辑[^3] } } ``` #### 二、经典使用案例 **1. 按钮点击事件处理(Android示例)** ```java // 定义点击事件接口 public interface OnClickListener { void onClick(View v); } // 按钮类 public class Button { private OnClickListener listener; public void setOnClickListener(OnClickListener l) { this.listener = l; } public void performClick() { if(listener != null) { listener.onClick(this); // 触发点击回调[^4] } } } // 使用方实现 public class Activity implements OnClickListener { public void initUI() { Button btn = new Button(); btn.setOnClickListener(this); } @Override public void onClick(View v) { System.out.println("按钮被点击"); // 实际响应逻辑 } } ``` **2. 异步任务回调** ```java public class AsyncTask { public interface Callback { void onPreExecute(); void onPostExecute(String result); } public void execute(Callback cb) { cb.onPreExecute(); new Thread(() -> { String result = doBackgroundWork(); cb.onPostExecute(result); // 后台任务完成回调[^3] }).start(); } private String doBackgroundWork() { // 模拟耗时操作 return "处理结果"; } } ``` #### 三、注意事项 1. **空指针防护** 在调用回调方法前必须检查接口引用是否为空 ```java if(callback != null) callback.onComplete(data); ``` 2. **内存泄漏预防** 在Android等场景中,建议使用弱引用保存回调对象 ```java private WeakReference<CallbackInterface> weakCallback; ``` 3. **线程安全性** 异步回调时需注意线程切换,Android中需使用Handler切换到主线程更新UI 4. **接口设计规范** 推荐采用`on[事件名称]`的命名方式,如`onSuccess()`, `onError()` #### 四、应用场景 1. 事件驱动编程(如GUI组件交互) 2. 异步任务结果通知(网络请求、文件IO) 3. 观察者模式实现 4. 插件式架构设计
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值