Chào mọi người, hơn một tháng nay mới bắt đầu xin được việc thực tập về Android nên cũng không có thời gian đăng bài. Nhân ngày chủ nhật nắng 40 độ C thì mình cũng vặn được ra một bài về cái mà mình cũng mới học được luôn, đó là EventBus.
EventBus trong Android là gì
Trước hết phải biết EventBus là cái quái gì đã. Hiểu đơn giản là nó sẽ giúp gửi dữ liệu từ bất kỳ đâu trong ứng dụng của bạn. Ví dụ từ 1 activity tới service, từ service đến activity, đến fragment, từ service đến service, cũng khá giống với broadcast receiver nhưng linh hoạt hơn và dễ sử dụng hơn.
Mô hình của nó đây, ảnh mình xin mượn từ trang github của Eventbus. Theo mô hình này thì 1 publisher sẽ gửi 1 event và những đối tượng nào subcribe nó thì sẽ nhận được event đó. Giống như Youtube vậy đó, khi bạn subcrice 1 kênh nào đó thì khi có video mới thì tất cả những subcriber sẽ nhận được thông báo, bạn hủy subcribe thì sẽ không nhận được thông báo nữa. Mô hình của nó hoàn toàn tương tự như vậy.
Lợi thế của EventBus:
– Dễ sử dụng.
– Dễ dàng kết nối giữa các đối tượng trong ứng dụng.
– Tránh các vấn đề liên quan đến vòng đời của các thành phần.
Cách sử dụng EventBus trong ứng dụng Android
Hiểu sơ qua rồi thì bắt tay vào áp dụng luôn. Trong bài này mình hướng dẫn các bạn dùng EventBus của GreenRobot, mình đọc được có 2 loại nhưng mình thấy cái này dễ tiếp cận hơn.
Thêm EventBus vào project:
Nếu thêm bằng Gradle:
implemention 'org.greenrobot:eventbus:3.1.1'
Nếu thêm bằng Maven:
<dependency> <groupId>org.greenrobot</groupId> <artifactId>eventbus</artifactId> <version>3.1.1</version> </dependency>
Khi bạn chỉnh sửa trong Gradle thì sẽ có thông báo cập nhật lại project, bạn nhấn nút sync now để cập nhật nhé.
Code EventBus
Đầu tiên bạn phải hiểu rằng EventBus gửi và nhận thông qua các Object, khi publisher gửi object nào thì subcriber nào mà lắng nghe object đấy mới có thể nhận được, chứ không phải tất cả đều có thể lắng nghe. Một ví dụ nhỏ như này nhé, ví dụ từ activity gửi class Animal và bên service có 3 sư kiện lắng nghe 3 class đó là Animal, Tree và People thì chỉ có sự kiện nào lắng nghe class Animal mới nhận được, còn 2 sự kiện kia sẽ không được thực hiện.
Mình tạo một class mang tên Message
public class Message { private String message; public void Message(String message) { message = this.message; } public String getMessage() { return message; } }
Mục đích của class này chỉ để gửi dữ liệu đi thôi, không có gì cả. Bây giờ bạn phải đăng kí nhận và gửi dữ liệu cho activity, fragment hay service mà bạn cần dùng EventBus.
@Override public void onStart() { super.onStart(); EventBus.getDefault().register(this); } @Override public void onStop() { super.onStop(); EventBus.getDefault().unregister(this); }
Trang chủ của Eventbus khuyên bạn nên đăng ký ngay khi vừa mới bắt đầu khởi tạo và hủy đăng ký khi dừng hoạt động.
Trong đối tượng bạn muốn lắng nghe sự kiện thì bạn phải đăng ký subcribe cho nó. Lưu ý tên hàm onMessageEvent là bạn thích đặt như thế nào cũng được, miễn là tham số đúng là đối tượng mà bạn cần nhận được.
@Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(Message mes) { String message = mes.getMessage(); // do something };
Cuối cùng để gửi event đi thì bạn dùng:
EventBus.getDefault().post(new Message("Hello World!"));
Khi bạn gửi Event, hàm onMessageEvent() sẽ được gọi vì bạn gửi object Message và nó cũng đang lắng nghe object này. Bạn chú ý khi mình đăng ký thì phải khai báo ThreadMode, mục đích của nó thì để cho nó chạy trên luồng nào. Ví dụ là MAIN thì sẽ chạy trên luồn chính, và nếu có cập nhật gì đến UI thì bạn phải chạy trên cái này, BACKGROUND thì sẽ chạy trên background… bạn có thể tìm hiểu thêm ở đây để xem về các luồng trong EventBus.
Một ví dụ thực tế hơn nhá. Ví dụ mình muốn làm ứng dụng gửi tin nhắn thông qua internet, kiểu như facebook ấy. Để nhận được tin nhắn thì mình phải cho phần nhận tin của mình chạy trên service thì mới nhận được tin nhắn ngay cả khi không bật ứng dụng. Khi nhận được tin nhắn thì mình sẽ gửi tin nhắn từ service về cho activity thông qua EventBus, để gửi tin nhắn thì mình lại gửi từ activity lên service thông qua EventBus tiếp, do đó mình sẽ tạo 2 class, trong đó 1 class để nhận message từ activity gửi lên serivice, và 1 class dùng để gửi message từ service về activity. Giả sử nếu chỉ dùng 1 class, khi service gửi event thì cả service và activity đều có thể lắng nghe được, tương tự với activity, do đó gây khó khăn cho việc xử lý dữ liệu. Lưu ý chỉ khi ứng dụng đang bật thì mình mới có thể gửi về activity được, vì nếu không bật thì acitivity đâu có lắng nghe được nữa đâu vì khi tắt thì phải chạy qua hàm onStop và hủy lắng nghe rồi.
Chắc đến bây giờ thì bạn đã hiểu được cách mà EventBus hoạt động rồi, từ khi biết được cái này thì việc trao đổi dữ liệu của mình được làm nhanh hơn nhiều và đỡ phiền toái hơn như sử dụng broadcast receiver hay phải nối giữa activity và service.
Nếu bạn muốn tìm hiểu sâu hơn thì bạn hãy vào github của EventBus GreenRobot để hiểu rõ hơn.
Viết xong thì trời cũng gần hết nắng rồi. Chúc các bạn có một tuần làm việc vui vẻ và thành công.