2012-10-15 39 views
5

Tôi đã tìm kiếm trên Google để tìm hiểu cách tạo sự kiện tùy chỉnh và trình xử lý sự kiện. Sau khi đọc một số bài viết về nó, tôi vẫn còn bối rối. Tôi muốn hỏi các bạn xem xét các cách để tạo sự kiện tùy chỉnh (các sự kiện không liên quan đến GUI) và các trình xử lý. Một số có thể cung cấp một giải thích đơn giản về cách tạo các sự kiện và người nghe tùy chỉnh không?Sự kiện Java và trình nghe sự kiện

Trả lời

6

Bạn về cơ bản tạo ra một giao diện như người nghe như

public interface EatListener { 

    ... 

} 

bên trong lớp EatListener, bạn có phương pháp mà bạn gọi với sự kiện như tham số của phương pháp; chẳng hạn như

public void onEat(EatEvent); 

thì bạn có thể có một lớp như Con người thực hiện hoặc khởi tạo một trình xử lý ăn; chẳng hạn như

public class Human { 

    private EatListener listener; 

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

} 

thì bạn cần có chế độ ăn thực tế; có thể đơn giản như trình bao bọc cho thực phẩm với một số dữ liệu bổ sung.

Như với bất kỳ GUI trên java bạn có thể tạo các lớp bên trong vô danh từ giao diện đó:

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

Tôi đã viết rất nhiều hệ thống dựa trên sự kiện (phi gui) và có rất nhiều gotchas trong việc thực hiện của riêng bạn . Một số trong những điều cổ điển là luồng và rò rỉ bộ nhớ.

Điều khiển luồng/xử lý đơn giản có nghĩa là khi bạn kích hoạt sự kiện, khi nào trình lắng nghe được gọi - ngay lập tức hoặc sau này? Nếu bạn bắn ngay lập tức, bạn có thể kết thúc với một hệ thống thực sự kém hiệu quả, nó liên tục phản ứng với một sự kiện thay đổi ngay lập tức sau khi người nghe đã được gọi. Không có câu trả lời dễ dàng ở đây, và nó thực sự phụ thuộc vào nhu cầu của bạn. Nói chung, nếu bạn có thể trì hoãn việc kích hoạt sự kiện, bạn sẽ có một hệ thống hoạt động tốt hơn (vì nó có thể tránh gọi người nghe nhiều lần cho cùng một sự kiện - hoặc một chu kỳ sự kiện dẫn đến cùng một sự kiện)

Gotcha lớn thứ hai là rò rỉ bộ nhớ. Việc thiếu xóa trong Java là một điều đáng yêu, nhưng người nghe là một khẩu súng khổng lồ được gắn vào chân bạn. Nếu bạn có một trình lắng nghe được gắn vào một cá thể sử dụng một tải bộ nhớ, miễn là một đối tượng khác chứa một tham chiếu đến trình lắng nghe đó, bộ nhớ đó sẽ bị treo xung quanh. Có một loạt các giải pháp cho điều này, chẳng hạn như WeakReferences nhưng nói chung, bạn cần phải khá cẩn thận và kiểm tra số lượng người nghe khi bạn đang thử nghiệm ứng dụng của bạn và chắc chắn rằng họ tách (unlisten? :)) một cách duyên dáng.

Tóm lại, nếu tôi là bạn, tôi sẽ xem xét sử dụng một cái gì đó như: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/eventbus/package-summary.html http://codingjunkie.net/guava-eventbus/ đã được phát triển với nhiều vấn đề trong tâm trí.

Các vấn đề liên quan