Search…

Bản Chất của Event trong Android

15/11/20204 min read
Tìm hiểu về event trong Android và cách sử dụng event trong Android.

Đặt vấn đề về event

Khi mới lập trình giao diện (GUI), lập trình viên sẽ tiếp cận khái niệm event, tại sao khi click vào 1 button lại có 1 phương thức để xử lý và truyền những tham số cần thiết để sử dụng như vậy?

Ví dụ khi click vào Button trong Android:

Button btnExample = (Button) findViewById(R.id.btnExample);
btnExample.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // Do something here    
    }
});

Hay khi nhấn vào 1 item trên ListView.

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

Event là gì?

Event được hiểu là 1 khi hành động được xảy ra thì phản hồi với hành động như thế nào? Ví dụ khi nhấn vào button thì xử lý những đoạn mã trong phương thức callback onClick của interface OnClickListener.

Giả sử có 1 sản phẩm, khi giá của sản phẩm này thay đổi thì xuất ra thông báo, cùng phân tích hai trường hợp theo hướng if elseevent.

if else

Được hiểu đúng nghĩa là: "Nếu giá của sản phẩm thay đổi thì xuất ra thông báo".

event

Được hiểu là: "Một khi giá của sản phẩm thay đổi thì xuất ra thông báo".

Xây dựng Event trong Android

Ví dụ có 1 sản phẩm và khi sản phẩm đó có giá thay đổi thì sẽ phát sinh ra sự kiện thông báo giá thay đổi và gửi kèm thông tin là giá cũ và giá mới.

Class Product bao gồm thuộc tính là:

  • name: tên sản phẩm.
  • price: giá sản phẩm.
public class Product {
    private String name;
    private double price;

    public Product() {
    }

    public Product(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

Bước thứ 2, tạo 1 interface OnPriceChanged

public interface OnPriceChanged {
    public void onChanged(double oldPrice, double newPrice);
}

Cuối cùng triển khai event OnPriceChanged trong model Product 

public class Product {
    private String name;
    private double price;
    private OnPriceChanged mListener;

    public Product() {
    }

    public Product(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        if(this.price == price)
            return;
        double oldPrice = this.price;
        this.price = price;
        if(mListener != null){
            mListener.onChanged(oldPrice, this.price);
        }
    }

    public void setOnPriceChangedListener(OnPriceChanged listener){
        mListener = listener;
    }
}

Ở đây sẽ triển khai event trong phương thức setPrice() để kiểm tra giá thay đổi. Nếu giá thay đổi và có đăng kí event (nghĩa là mListener != null) thì phát sinh sự kiện onChanged và gửi kèm 2 giá trị là oldPricenewPrice của Product.

Sử dụng Event

Product product = new Product("Iphone 7 Plus", 20000000);
product.setOnPriceChangedListener(new OnPriceChanged() {
    @Override
    public void onChanged(double oldPrice, double newPrice) {
       Log.e(TAG, "onChanged: " + "oldPrice: " + oldPrice + ", newPrice: " + newPrice);
    }
});      
product.setPrice(25000000);

Trước tiên sẽ tạo 1 project và ấn định giá trị ban đầu cho nó với name là "iPhone 7 Plus" và price có giá trị 2000000. Tiếp theo sẽ đặt bộ lắng nghe sự kiện trên đối tượng product để lắng nghe sự kiện onChanged (sự kiện giá thay đổi của sản phẩm).

Và mỗi khi thay đổi giá của sản phẩm thì phương thức onChanged() luôn được gọi.

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