2012-10-15 240 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/它已開發出許多這些問題的念頭。