Sự khác biệt giữa Trình xử lý & Trình xử lý Sự kiện trong Java là gì?


81

Nói chung về java, có các trình nghe và xử lý cho các sự kiện.
Ý tôi là tôi vô tình sử dụng chúng, chỉ cần cái nào có sẵn trong API.

Câu hỏi của tôi là, trong trường hợp nào chúng ta sử dụng người nghe và trường hợp nào chúng ta sử dụng trình xử lý cho các sự kiện?

Sự khác biệt giữa chúng là gì? Nét đặc trưng??

Tôi đã tìm kiếm lý do và tôi không thể tìm thấy lời giải thích thích hợp cho Java.


Bài đăng trên blog này có một bản tóm tắt tốt đẹp. lemnik.wordpress.com/2009/03/04/…
kevinarpe

Câu trả lời:


62

Không có sự khác biệt được xác định chính thức giữa người nghe và người xử lý. Một số người có thể tranh luận rằng chúng có thể hoán đổi cho nhau. Tuy nhiên, đối với tôi, chúng có ý nghĩa hơi khác.

Người nghe là một đối tượng đăng ký các sự kiện từ một nguồn. Cf các mô hình quan sát . Thông thường, bạn có thể có nhiều người nghe đăng ký cho mỗi loại sự kiện và chúng được thêm vào thông qua addXyzListenercác phương thức.

Ví dụ: Các MouseListenertrong API Java.

Trình xử lý là một đối tượng chịu trách nhiệm xử lý các sự kiện nhất định. Một kịch bản điển hình sẽ là cung cấp một trình xử lý cho một sự kiện / nhiệm vụ cụ thể làm đối số cho một phương thức khởi tạo, hoặc thiết lập trình xử lý thông qua một setXyzHandlerphương thức. Nói cách khác, bạn thường có một trình xử lý cho mỗi loại sự kiện.

Ví dụ: Các MemoryHandlertrong API Java.


Hi, cảm ơn bạn cho câu trả lời của bạn. ý bạn là gì khi "đăng ký sự kiện"? bạn hiểu "người nghe" nghĩa là gì?
BKSpurgeon

@BKSpurgeon, hãy xem bài viết Wikipedia về Mẫu người quan sát được liên kết trong câu trả lời.
aioobe

32

Sự khác biệt cơ bản nhất là sự liên kết

  • Trình nghe được liên kết với Nguồn sự kiện (Ví dụ: bảng phím)
  • Trình xử lý được liên kết với một Sự kiện (Ví dụ: keydown)

Nói chung, sẽ chỉ có một Trình quản lý xử lý trung tâm quản lý tất cả các sự kiện, trong khi trong trường hợp Trình xử lý, mỗi Thực thể muốn lắng nghe, sẽ phải quản lý Bộ sưu tập người nghe của riêng họ.


Chuột là nguồn gốc sự kiện, nếu bạn nhìn vào sự tương tự MouseListener được assocaited với nguồn sự kiện whcih là chuột
Swapnil

23

Đây là cách tôi nhìn thấy nó:

Một người nghe theo dõi một sự kiện sẽ bị sa thải. Ví dụ, một KeyListenerđợi cho KeyEvents, một MessageListenerchờ tin nhắn đến hàng đợi, v.v.

Người xử lý có trách nhiệm đối phó với sự kiện. Thông thường, người nghe và người xử lý đi đôi với nhau. Ví dụ: KeyListener nói với ExitHandler rằng "ký tự Q đã được nhấn" và trình xử lý thực hiện logic như dọn dẹp tài nguyên và thoát ứng dụng một cách duyên dáng. Tương tự, một ButtonClickListener sẽ cho cùng một ExitHandler biết rằng "Nút thoát đã được nhấp". Vì vậy, trong trường hợp này, bạn có hai sự kiện khác nhau, hai người nghe khác nhau nhưng một trình xử lý duy nhất.


5

Người nghe là một đối tượng được thông báo khi một sự kiện xảy ra và nó có 2 yêu cầu chính- 1-nó phải được đăng ký với một hoặc nhiều nguồn để nhận thông báo về các loại sự kiện cụ thể 2-nó phải triển khai các phương thức để nhận và xử lý những thông báo này. Handler chịu trách nhiệm giải quyết các sự kiện.


4

Một người nghe, lắng nghe các sự kiện là các đối tượng giá trị dữ liệu mô tả một sự kiện. Khi sự kiện xảy ra và thứ tự của các sự kiện thường quan trọng. Nhấn phím '0' theo sau là '1' khác với '1' và '0'.

Một trình xử lý, xử lý một đối tượng phức tạp, ví dụ như một kết nối Socket mới. Trình xử lý có thể xử lý đối tượng trong bất kỳ khoảng thời gian nào. Thời điểm tạo đối tượng và thứ tự không quá quan trọng. Kết nối từ client0 hoặc client1 có thể xảy ra theo bất kỳ thứ tự nào.


4

Tôi nghĩ rằng sự khác biệt là nhỏ bởi vì một Listener cụ thể cũng là một trình xử lý sự kiện hoặc ít nhất có một phương pháp có thể được coi là một trình xử lý sự kiện. Nghĩa là, một Listener cụ thể xử lý hoặc quản lý phản ứng với sự kiện sau khi nhận được một đối tượng sự kiện (từ nguồn sự kiện) với tất cả các thông tin hữu ích về sự kiện vừa xảy ra (trên nguồn sự kiện). Vì Listener này phải triển khai giao diện xxxListener buộc anh ta phải triển khai ít nhất một phương thức được thực thi bởi đối tượng nguồn sự kiện khi sự kiện xảy ra, vì vậy bản thân Listener có thể được coi là một trình xử lý và chính xác hơn là phương thức của giao diện Listener được thực hiện bởi đối tượng Listener có thể được coi là trình xử lý sự kiện thực. Vì vậy, tôi xem trình xử lý sự kiện chỉ là mã được thực thi để phản ứng với một sự kiện. Điều này khác với đối tượng Listener là một phần tử của khái niệm trừu tượng hơn, chẳng hạn như mẫu thiết kế Observer. Đây là quan điểm cá nhân của tôi về chủ đề này.


4

Theo suy nghĩ của tôi, sự khác biệt quan trọng nhất là chúng tôi sử dụng trình lắng nghe cho mỗi nguồn của sự kiện, trái ngược với trình xử lý, là cho mỗi loại sự kiện.


2

Về mặt khái niệm, chúng giống nhau - một đối tượng thực hiện một số hành động để phản hồi lại một sự kiện giao diện người dùng. Nói chung, trong Swing, các đối tượng này được gọi là "trình xử lý" ở cấp giao diện (để xử lý các sự kiện tiện ích cấp thấp) và "trình nghe" ở cấp giao diện người dùng trừu tượng hơn (nơi bạn sẽ triển khai logic ứng dụng của mình ).


0

EventHandler được giới thiệu trong JavaFX cho tất cả các điều khiển giao diện người dùng. Trong khi đó, Listener được mượn cho các Observables, chẳng hạn như thuộc tính.

EventHandler là một cách để phân biệt các sự kiện có thể quan sát và các sự kiện ui.


0

Tôi đã cố gắng hiểu tất cả thông tin và tôi bị mất. Tôi đã xem xét Delphi (Pascal), C, C ++, java ... không có gì là rõ ràng. Vì vậy, sau một tháng, đây là vấn đề như tôi thấy. Tôi có thể hoàn toàn đi chệch hướng, vì vậy hãy nói với tôi ... lịch sự, làm ơn.

Một người gửi sự kiện, một người bắt giữ miễn là Người gửi đăng ký người bắt. Tôi có 4 hộp thoại cần được cập nhật mỗi khi tệp (có mã xử lý nằm trong mô-đun khác ngoài 4 hộp thoại) thay đổi. Tôi đã xem xét cập nhật từng cách cũ, nhưng sau đó tôi xem xét các sự kiện và xử lý tin nhắn của Delphi. Hãy xem nào:

Tệp F (Người gửi) đã đọc xong và sẽ thông báo cho Hộp thoại 1..4 về việc hiện có dữ liệu để chúng hiển thị và người dùng có thể xử lý. Tốt nhất là gì?

Cố gắng đăng ký Hộp thoại 1..4 làm người nghe và yêu cầu Người gửi kích hoạt OnUpdatedDataEvent bằng cách nào đó?

Hãy thử gửi một tin nhắn trên toàn hệ thống, hy vọng Hộp thoại 1..4 sẽ bắt được nó?

Lưu ý rằng sự kiện giữ cho mọi thứ được kết hợp trong khi nhắn tin thì không ... và rất khó để gỡ lỗi.

Và tôi tự hỏi làm thế nào để khối tệp tin có thể đăng ký 4 người nghe (hộp thoại)?

Những gì tôi đang xem xét là khả năng gọi theo tầng, có nghĩa là người gọi gọi một người nghe, người gọi tiếp theo ... cho đến khi nó đi đến cuối chuỗi. Tôi thậm chí tự hỏi nếu điều đó thậm chí có thể.

Một ví dụ:

Giả sử Tệp F là một danh sách các ngôn ngữ. Bây giờ, DialogBox 1 thực hiện một cái gì đó cho danh sách (thêm một ngôn ngữ mới chẳng hạn); hộp tổ hợp đó cập nhật tệp F; đến lượt nó lại kích hoạt DataUpdatedEvent. 4 hộp thoại chứa TComboBoxes hiển thị danh sách ngôn ngữ khi chúng bật lên. Tôi muốn 4 hộp thông báo thay đổi và cập nhật nội dung hộp kết hợp của riêng chúng bằng Tệp mới cập nhật ... mà không phải lo lắng về cách các hộp kết hợp biết chúng cần làm mới nội dung của chúng. Nếu nó hoạt động như đã hình dung, thông số Người gửi sẽ chuyển qua và hộp thoại kích hoạt dataUpdateEvent sẽ bị bỏ qua vì nó đã được cập nhật. Sau tất cả, if sender = self thì tiếp tục xử lý sự kiện tiếp theo sẽ dễ thực hiện.

Tất cả những điều đó bởi vì tôi muốn tập thể dục trí não của mình ... để ngăn ngừa bệnh Alzheimer, tôi có thể thêm vào không thành công lắm.


Xin chào và chào mừng bạn đến với StackOverflow! Điều này có nghĩa là một câu trả lời cho câu hỏi ban đầu ("Sự khác biệt giữa trình xử lý sự kiện và trình xử lý trong Java là gì?"). Nếu vậy, có thể hữu ích nếu diễn đạt lại nó để nó trả lời trực tiếp hơn câu hỏi, giải thích rõ ràng các đặc điểm của trình xử lý sự kiện so với trình xử lý trong Java.
Alex Lew

-1

Đó là ngữ nghĩa.

  • Trình nghe là giao diện.
  • Bộ điều hợp là lớp thực thi giao diện cụ thể và cung cấp triển khai trống cho các phương thức của nó. Điều này giúp ích nếu bạn không phải thực hiện tất cả các phương pháp của giao diện.
  • Handler thực hiện một số giao diện hoặc các cuộc gọi ủy quyền đến một số giao diện.

1
Tôi sẽ không nói rằng người nghe nhất thiết phải là một giao diện. Các BasicButtonListener ví dụ là một lớp bê tông.
aioobe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.