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 main
là static
.