2012-10-15 61 views
5

我在Google上搜索了解如何创建自定义事件和事件监听器。在阅读了一些关于它的文章后,我仍然感到困惑。我想请你们对 进行自定义事件(非GUI相关事件)和处理程序的评论。有些人可以提供关于如何创建自定义事件和侦听器的简单解释吗?Java事件和事件监听器

回答

6

基本上,你创建一个接口作为听者如

public interface EatListener { 

    ... 

} 

的EatListener类中,您有与该事件作为方法的参数调用方法;如

public void onEat(EatEvent); 

那么你可以有一个像Human这样的类来实现或实例化一个EatListener;如

public class Human { 

    private EatListener listener; 

    public void eatFood(Food food) { 
     if(listener != null) { 
      listener.onEat(new EatEvent(food)); 
     } 
    } 

} 

那么你需要有实际的EatEvent;它可以像包装食品一样简单,并可能有一些额外的数据。

与Java的,你可以从该界面创建匿名内部类的任何GUI:

new EatListener() { 
    public void onEat(EatEvent event) { 
     System.out.println("I just ate " + event.getFood().getName()); 
    } 
} 
1

我已经写了很多基于事件的系统(非GUI),并有在实现自己的许多陷阱。一些经典的东西是线程和内存泄漏。

线程/进程控制仅仅意味着当你触发一个事件时,监听器什么时候被调用 - 立即或之后呢?如果立即触发,最终可能会导致性能很差的系统不断响应在侦听器被调用后立即发生更改的事件。这里没有简单的答案,这取决于你的需要。一般来说,如果你可以推迟一个事件的发射,你将会有一个更好的表演系统(因为它可能避免多次为同一个事件呼叫聆听者 - 或导致相同事件的一个事件周期)

第二大难题是内存泄漏。在Java中缺少删除是一件可爱的事情,但听众是一个巨大的枪,绑在你的脚上。如果你有一个连接到使用内存负载的实例的监听器,只要另一个对象包含对该监听器的引用,那么这个内存就会被挂起。有很多解决方案,比如WeakReferences,但是一般来说,当你测试你的应用程序时,你需要非常小心并且检查一下监听器的数量,并且确保它们优雅地分离(unlisten?:))。

总之,如果我是你,我会考虑使用类似的东西:http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/eventbus/package-summary.html http://codingjunkie.net/guava-eventbus/它已开发出许多这些问题的念头。