Nội dung bài viết
STDIO Khái niệm event khá là quen thuộc với những lập trình viên khi lập trình giao diện, như sự kiện click khi nhấn button, sự kiện khi chạm vào một item trên listview. Vậy chúng ta có thể tạo ra event hay không, và tạo nó như thế nào, cách hoạt động ra sao thì bài viết này sẽ cùng bạn khám phá kiến thức về event trong ngôn ngữ Java.

Giới thiệu

Khái niệm event khá là quen thuộc với những lập trình viên khi lập trình giao diện, như sự kiện click khi nhấn button.

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

sự kiện khi 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
            }
        });

hay sự kiện 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) {

            }
        });

Vậy chúng ta có thể tạo ra event hay không, và tạo nó như thế nào, cách hoạt động ra sao thì bài viết này sẽ cùng bạn khám phá kiến thức về event trong ngôn ngữ Java.

Tiền đề bài viết

Tôi nhận thấy không phải ai cũng có thể hiểu được khái niệm event trong java, cũng như cách tạo ra nó như thế nào. Sau một quá trình tìm hiểu, học tập tôi muốn chia sẻ kiến thức khá bổ ích này cùng các độc giả. Hy vọng những kiến thức nhỏ bé này sẽ giúp ích được cho các bạn trong học tập cũng như công việc mà các bạn đang gặp phải.

Đối tượng hướng đến

Những lập trình viên đang tìm hiểu kiến thức về event, bài biết này hướng tới các bạn có kiến thức chuyên sâu về ngôn ngữ lập trình 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 chính là đối tượng phát sinh sự kiện, onClick chính là phương thức đăng kí sự kiện, OnClickListener chính là bộ lắng nghe sự kiện.

Triển khai sự kiện trong java

Gồm có các bước sau:

  • 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 lại phương thức đã khai báo ở interface ở bước 1.

Ví dụ

Tôi có class Product có thuộc tính đó là tên và giá của sản phẩm, mỗi khi mà giá của sản phẩm thay đổi thì tô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ị tôi sẽ truyền sang khi phát sinh sự kiện.

Khai báo và set 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à set 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;
	}
	
}

Các bạn để ý tới hàm setPrice, khi giá trị của Product thay đổi và bộ lắng nghe sự kiện mListener != null thì chúng ta sẽ callback phương thức onPriceChanged

 Cuối cùng là chúng ta sử dụng event này như thế nào. Có hai cách như dưới đây để chúng ta có thể 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 tôi set giá trị 200 thì trong phương thức setPrice sẽ kiểm tra giá có thay đổi hay không và bộ lắng nghe sự kiện mListener có khác null hay 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 tôi chỉ in ra thông tin tên, giá của và giá mới của sản phẩm. Nhưng chúng ta có thể làm bất cứ gì mà chúng ta muốn trong phương thức này ví dụ như update 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ẳng hạn.

Chú ý: Với hàm main ở ví dụ trên thì 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 main là static. Tuy nhiên tôi vẫn đều cập tới cách thứ hai là khi các bạn sử dụng trong các class khác.

Lời kết

Qua bài biết này tôi hy vọng rằng các bạn khi tiếp xúc với event thì có thể hiểu bản chất của nó là gì chứ không phải là chỉ là "nhớ" event như khi sử dụng Button sẽ nhớ setOnClickListener mà không biết bản chất của nó tạo ra như thế nào. Nếu có bất cứ thắc mắc, khó khăn nào thì có thể để lại bình luận ở phía dưới để được giải đáp sớm nhất.

Download Source

CustomEvent.zip

THẢO LUẬN
ĐÓNG