STDIO
Tìm kiếm gần đây
    • 0

    Custom Event trong Java

    Khái niệm event rất quen thuộc với lập trình giao diện, sự kiện khi nhấn button, sự kiện khi chạm vào một item trên listview, vậy có thể tạo ra event hay không, và tạo nó như thế nào, cách hoạt động ra sao trong Java?
    19/11/2015
    19/09/2020
    4 phút đọc
    Custom Event trong Java

    Event là gì?

    Hiểu đơn giản event là một khái niệm chỉ ra rằng khi phát sinh một cái gì đó thì sẽ làm một cái gì đó. Ví dụ khi nhấn chuột thì chúng ta sẽ làm những gì chúng ta muốn trong phương thức onClick

    Event sẽ có ba thông tin chính đó là:

    • Đối tượng phát sinh sự kiện: Source
    • Phương thức đăng ký sự kiện: Subscriber
    • Bộ lắng nghe sự kiện: Listener

    Ví dụ class Button trong Android thì:

    • Button là đối tượng phát sinh sự kiện.
    • onClick là phương thức đăng ký sự kiện.
    • OnClickListener là bộ lắng nghe sự kiện.

    Sự kiện nhấn vào 1 button

    btnSend.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //TODO something
                }
            });

    Sự kiện chạm vào một item trên listview

    lvChat.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    //TODO something
                }
            });

    Sự kiện text thay đổi, TextChanged của EditText

    edtMessage.addTextChangedListener(new TextWatcher() {
    	@Override
    	public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    	}
    
    	@Override
    	public void onTextChanged(CharSequence s, int start, int before, int count) {
    	}
    
    	@Override
    	public void afterTextChanged(Editable s) {
    	}
    });

    Khái niệm event khá là quen thuộc khi lập trình giao diện, vậy có thể tạo ra event hay không, và tạo nó như thế nào, cách hoạt động ra sao?

    Triển khai sự kiện trong Java

    • Bước 1: Tạo interface với phương thức đăng ký event.
    • Bước 2: Khai báo và set giá trị cho bộ lắng nghe sự kiện.
    • Bước 3: Phát sinh sự kiện, callback (gọi phương thức) đã khai báo ở interface ở bước 1.

    Ví dụ class Product có thuộc tính đó là tên và giá của sản phẩm, mỗi khi giá của sản phẩm thay đổi sẽ lấy về thông tin tên sản phẩm, giá cũ, giá mới của sản phẩm.

    Tạo interface với phương thức đăng ký event

    public interface OnPriceChangedListener {
    	public void onPriceChanged(String name, double oldPrice, double newPrice);
    }
    

    Trong phương thức onPriceChanged có các tham số là name, oldPrice, newPrice là giá trị sẽ truyền sang khi phát sinh sự kiện.

    Khai báo và gán giá trị cho bộ lắng nghe sự kiện

    Khai báo class Product như sau:

    public class Product {
    	private String mName;
    	private double mPrice;
    	
    	public Product() {	
    	}
    
    	public void setName(String name) {
    		this.mName = name;
    	}
        
    	public String getName(){
    		return this.mName;
    	}
    }

    Khai báo và gán giá trị cho bộ lắng nghe sự kiện:

    public class Product {
    	private String mName;
    	private double mPrice;
    	
    	private OnPriceChangedListener mListener;
    	
    	public Product() {	
    	}
    
    	public void setName(String name) {
    		this.mName = name;
    	}
        
    	public String getName() {
    		return this.mName;
    	}
    
    	public void setOnPriceChangedListener(OnPriceChangedListener listener) {
    		this.mListener = listener;
    	}
    }

    Phát sinh sự kiện, callback

    public class Product {
    	private String mName;
    	private double mPrice;
    	
    	private OnPriceChangedListener mListener;
    	
    	public Product() {		
    	}
    	
    	public void setName(String name) {
    		this.mName = name;
    	}
    	
    	public String getName() {
    		return this.mName;
    	}
    	
    	public void setPrice(double price) {
    		if (this.mPrice == price)
    			return;
    		double oldPrice = this.mPrice;
    		this.mPrice = price;
    		if (this.mListener != null) {
    			this.mListener.onPriceChanged(this.mName, oldPrice, this.mPrice);
    		}		
    	}
    	
    	public double getPrice() {
    		return this.mPrice;
    	}
    	
    	public void setOnPriceChangedListener(OnPriceChangedListener listener) {
    		this.mListener = listener;
    	}	
    }

    Trong hàm setPrice, khi giá trị của Product thay đổi và bộ lắng nghe sự kiện mListener != null thì callback phương thức onPriceChanged

    Sử dụng event

    Cách 1: Implement interface trực tiếp trong phương thức

    public class Program {
    	public static void main(String[] args) {
    		Product product = new Product();
    		product.setName("Tshirt");
    		product.setOnPriceChangedListener(new OnPriceChangedListener() {
    			@Override
    			public void onPriceChanged(String name, double oldPrice, double newPrice) {
    				System.out.println(name + ", " +  oldPrice + ", " + newPrice);
    			}
    		});
    		product.setPrice(200);
    	}
    }
    

    Cách 2: Implements interface với class

    public class Program implements OnPriceChangedListener {
    	public static void main(String[] args) {
    		Product product = new Product();
    		product.setName("Tshirt");
    		
    		// product.setOnPriceChangedListener(this);
    		product.setPrice(200);
    	}
    
    	@Override
    	public void onPriceChanged(String name, double oldPrice, double newPrice) {
    		System.out.println(name + ", " +  oldPrice + ", " + newPrice);
    	}
    }

    Khi gán giá trị 200 thì trong phương thức setPrice sẽ kiểm tra giá có thay đổi không và bộ lắng nghe sự kiện mListener có khác null không. Nếu đúng sẽ callback phương thức onPriceChanged và truyền các giá trị như name, oldPrice, newPrice qua phương thức. Kết quả chạy chương trình sẽ xuất ra là: Tshirt, 0.0, 200.0.

    Trong phương thức onPriceChanged trên chỉ in ra thông tin tên, giá của và giá mới của sản phẩm. Nhưng có thể làm bất cứ nghiệp vụ nào trong phương thức này ví dụ như cập nhật lại giá mới của sản phẩm xuống cơ sở dữ liệu hay hiển thị giá mới lên UI.

    Chú ý: với hàm main ở ví dụ trên chỉ sử dụng event theo cách 1. Còn cách 2 sẽ phát sinh lỗi do phương thức mainstatic.

    Download code tạo Event với Java

    CustomEvent.zip

    Java

    Java

    Tổng hợp các bài viết Java hữu ích

    Sản phẩm

    Đề xuất

    String Trong Java

    String Trong Java

    Giới thiệu về kiểu chuỗi và kỹ thuật thao tác với chuỗi trong ngôn ngữ ...

    JavaCơ Bản

    06/05/2015

    Delegates và Events trong C#

    Delegates và Events trong C#

    Giới thiệu và hướng dẫn sử dụng Event và Delegate trong C#.

    C# for AutomationKiến Thức

    28/11/2014

    Khám phá thêm

    Biến và Kiểu Dữ Liệu Cơ Bản trong Java

    Biến và Kiểu Dữ Liệu Cơ Bản trong Java

    Giới thiệu khái niệm, phạm vi hoạt động của biến và các kiểu dữ liệu ...

    JavaCơ Bản

    11/05/2015

    Event trong C#

    Event trong C#

    Giới thiệu và hướng dẫn cách hiện thực các event trong C#.

    C# for AutomationKiến Thức

    25/10/2015

    Cấu Trúc Điều Khiển Trong Java - Phần 1: Cấu Trúc Rẽ Nhánh

    Cấu Trúc Điều Khiển Trong Java - Phần 1: Cấu Trúc Rẽ Nhánh

    Hướng dẫn cấu trúc rẽ nhánh if-else và switch-case trong Java.

    JavaCơ Bản

    21/05/2015

    Lập Trình Multithreading trong Ngôn Ngữ Lập Trình Java

    Lập Trình Multithreading trong Ngôn Ngữ Lập Trình Java

    Trong chương trình của chúng ta đôi khi ta cần thực thi nhiều tác vụ ...

    JavaNâng Cao

    19/11/2015

    Overloading Method - Nạp Chồng Hàm Trong Java

    Overloading Method - Nạp Chồng Hàm Trong Java

    Cơ chế hoạt động nạp chồng phương thức - method overloading trong Java.

    JavaCơ Bản

    17/08/2015

    Ghi Đè Phương Thức - Overriding Method trong Java

    Ghi Đè Phương Thức - Overriding Method trong Java

    Trong Java, ghi đè phương thức - overriding method là phương pháp "viết ...

    JavaCơ Bản

    27/05/2015

    Xử Lý Sự Kiện Trong SDL

    Xử Lý Sự Kiện Trong SDL

    Hướng dẫn xử lý sự kiện trong game bằng thư viện SDL.

    Lập Trình GameSDL

    13/10/2015

    Tổng Quan về Ngôn Ngữ Lập Trình Java

    Tổng Quan về Ngôn Ngữ Lập Trình Java

    Java là 1 trong những ngôn ngữ lập trình mạnh mẽ, được sử dụng rộng rãi ...

    JavaKiến Thức

    20/05/2015

    STDIO
    Trang chính
    Công ty TNHH STDIO

    30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
    +84 28.36205514 - +84 942.111912
    developer@stdio.vn

    383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
    Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012

    ©STDIO, 2013 - 2020