STDIO
Tìm kiếm gần đây
    Nội dung
    0
    0
    Chia sẻ
    Nội dung
    0
    0
    Chia sẻ

    Custom Event trong Java

    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?
    19/11/2015 19/09/2020 4 phút đọc
    Custom Event 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

    0 Bình luận
    Java

    Java

    Tổng hợp các bài viết Java hữu ích từ STDIO Training - Đào Tạo Lập Trình

    Khi bạn nhấn vào sản phẩm do chúng tôi đề xuất và mua hàng, chúng tôi sẽ nhận được hoa hồng. Điều này hỗ trợ chúng tôi có thêm kinh phí tạo nhiều nội dung hữu ích. Tìm hiểu thêm.
    STDIO

    Trang chính

    Công ty TNHH STDIO

    • 30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
      +84 28.36205514 - +84 942.111912
      developer@stdio.vn
    • 383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
      Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012
    ©STDIO, 2013 - 2021