Search…

Custom Event trong Java

19/09/20204 min read
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?

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

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024