Mục lục
Callback là một hàm được truyền vào một hàm khác như một tham số đầu vào và được thực thi dựa trên những sự kiện cụ thể như người dùng nhấp vào button, hay gọi sau khi quá trình tải dữ liệu hoàn tất v.v.
Callback được sử dụng rất nhiều trong xử lý sự kiện, ví dụ như khi người dùng nhấp vào button login, callback sẽ được gọi với thông tin username, password mà người dùng đã nhập vào để tiến hành kiểm tra xem nếu hợp lệ thì thông báo đăng nhập thành công còn không thì thông báo lỗi cho người dùng.
Triển khai Callback trong Java
Trong Java, Chúng ta có thể sử dụng interface để triển khai callback thông qua các bước cơ bản sau:
- Triển khai các method trong một interface mà chúng ta muốn dùng làm callback (1).
- Định nghĩa một class implement từ interface (1) để triển khai các method được định nghĩa trong đó (2).
- Định nghĩa một biến tham chiếu đến interface (1) trong một class khác nơi sẽ gọi các callback trong interface (3).
- Sử dụng class (3) để gọi callback dựa trên những trường hợp cụ thể.
Synchronous Callback
Synchronous Callback là một dạng callback mà nơi gọi callback này phải đợi cho đến khi các mã code được định nghĩa bên trong đó hoàn tất thực thi và trả về kết quả mới được thực thi tiếp.
interface ClickEventListener { void onClick(String username, String password); } class Button { private ClickEventListener listener; public void onClickEvent(ClickEventListener listener) { this.listener = listener; } public void click() { System.out.println("Goi callback "); if (this.listener != null) { listener.onClick("username", "pass"); } } public static void main(String[] args) { Button button = new Button(); ClickEventListener listener = new ClickEventListenerImpl(); button.onClickEvent(listener); button.click(); } } class ClickEventListenerImpl implements ClickEventListener { @Override public void onClick(String username, String password) { System.out.println("Callback thuc thi"); System.out.println("User name: " + username); System.out.println("Password: " + password); } }
Output:
Goi callback
Callback thuc thi
User name: username
Password: pass
Một nhược điểm của Synchronous Callback là nơi gọi callback phải chờ cho đến khi nó thực thi xong mà không được thi bất kỳ tác vụ nào trong thời gian chờ do đó sẽ dẫn đến cảm giác lag cho người dùng.
Asynchronous Callback
Khác với Synchronous Callback, chương trình không cần phải đến khi Asynchronous Callback thực thi xong, mà nó có thể thực thi các tác vụ khác trong quá trình Asynchronous Callback thực thi.
Trong Java, để triển khai Asynchronous Callback chúng ta cần tạo một thread mới và gọi callback trong thread này.
interface ClickEventListener { void onClick(String username, String password); } class Button { private ClickEventListener listener; public void onClickEvent(ClickEventListener listener) { this.listener = listener; } public void click() { new Thread(new Runnable() { @Override public void run() { System.out.println("Goi callback "); if (listener != null) { listener.onClick("username", "pass"); } } }).start(); } public static void main(String[] args) { Button button = new Button(); ClickEventListener listener = new ClickEventListenerImpl(); button.onClickEvent(listener); button.click(); } } class ClickEventListenerImpl implements ClickEventListener { @Override public void onClick(String username, String password) { System.out.println("Callback thuc thi"); System.out.println("User name: " + username); System.out.println("Password: " + password); } }
Output:
Goi callback
Callback thuc thi
User name: username
Password: pass
Sử dụng Synchronous hay Asynchronous callback trong trường hợp nào?
Sử dụng Synchronous Callback trong trường hợp các tác vụ được thực thi phải theo thứ tự, các tác vụ tiếp theo phải chờ kết quả từ các callback vừa được gọi.
Sử dụng Asynchronous Callback khi các tác vụ cần thực thi độc lập không phụ thuộc và các kết qủa của nhau. Ngoài ra các tác vụ tốn nhiều thời gian để thực thi thì chúng ta cũng nên triển khai Asynchronous Callback.
Nguồn
https://www.geeksforgeeks.org/asynchronous-synchronous-callbacks-java/