Custom Event Trong Java

Cập nhật ngày: 30/11/2021 - Đã có 515 lượt xem bài viết này!
Custom Event Trong Java
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.

Custom Event Trong 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.

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.

Xem khóa đào tạo nhân sự theo danh mục!

Xem các khóa đào tạo nhân sự