EventBus trong Android
Bài đăng này đã không được cập nhật trong 9 năm
EventBus đã được giới thiệu trong Google IO 2013
Và được áp dụng vào Android kể từ đó.Thuật nghữ và cách thức hoạt động của EventBus đã được áp dụng trước đó rất lâu không chỉ trên riêng ngôn ngữ Java. EventBus giúp điều phối các sự kiện tránh hệ thống quá tải khi sử lý nhiều sự kiện và quản lý chúng.
Trong Android eventbus tối ưu hóa và đơn giản hóa các event cũng như trao đổi dữ liệu giữa các Activity, Fragment, Service, Theards..... với nhau.
EventBus đã được giới thiệu trong Google IO 2013. Nhưng hiện tại có hai thư việ phát triển và dựa theo khái quát mà Google đã đưa ra là EventBus của GreenBot và Otto của Square
Eventbus như là nơi quan lý các sự kiện hay điều khiển các quá trình xử lý dữ liệu.Nó giúp ta bắt sự kiện và lấy kết quả của quá trình đó tại bất kì đâu Activity, Fragments.....
Nếu như việc sử lý dự liệu ta dùng Theard đơn thuần... nhưng với nhiều sự kiện trao đổi diễn ra dẫn đến Overload Theard hoặc tràn bộ nhớ đệm, thiếu bộ nhớ dẫn đến ứng dụng hoạt động ì ạch. Lúc này Eventbus điều phối các hoạt động này giúp các hoạt động được sắp xếp hợp lý và việc trao đổi dữ liệu trở lên dễ dạng dựa vào các đăng ký hoạt động (subscribers event)
Thực tế kiểm chứng
Hiện tại EventBus của GreenBot có nhiều điểm mạnh hơn.Vì thế nghiên cứu này tập trung vào EventBus của GreenBot tại địa chỉ https://github.com/greenrobot/EventBus
Bước 1. Tạo phương thức để năng nghe sự kiện
public void onEvent(AnyEventType event) {}
Bước 2. đăng ký lắng nghe sự kiện eventBus.register(this);
Bước 3. Gửi sự kiện eventBus.post(event);
Bước 4. Hủy lắng nghe sự kiện eventBus.unregister(this);
Các kiểu gửi sự kiện:
**- PostThread : **đây là kiểu mặc định, đơn giản khi gửi sự kiện. Và nó không cần thiết chạy trên một Main Thread.
**- MainThread: **sự kiện sẽ được gọi từ Android's main thread. Và sẽ được gọi một cách trực tiếp
**- BackgroundThread: **sư kiện sẽ được gọi trong background thread. và nó sẽ được gọi trực tiếp ở nơi tạo sự kiện. và EventBus chỉ sử dụng 1 background thread để xử lý
**- Async: **sự kiện này luôn độc lập với main thread. Vì thế tránh sử dụng nhiều cùng 1 lúc.EventBus cũng sử dụng 1 thread pool để có thể tái sử dụng lại Tìm hiểu kĩ hơn với Demo Note Trong NoteApplication.java lần đầu tiên ta cần tạo dự liệu mẫu
DumyEvent dumyEvent = new DumyEvent("Created " + count + " note");
EventBus.getDefault().post(dumyEvent);
Tiếp đó tại MainActivity.java
protected void onCreate(Bundle savedInstanceState) {
….
eventBus = EventBus.getDefault(); // khởi tạo EventBus mặc định
….
eventBus.register(this); //đăng ký lắng nghe sự kiện mặc đinh
…..
}
** Vì trong NoteApplication gửi sự kiện từ Thread nên ta cần nắng nghe bằng _onEventMainThread để có thể cập nhật nội dung lại cho apdater (giống runOnUiThread)**
public void onEventMainThread(DumyEvent dumyEvent) {....
Lắng nghe mọi sự kiện về Note: add, update, delete….
public void onEvent(NoteEvent event) {
....
}
**Để gửi các sự kiện ** NoteEvent ta làm như sau
Khai báo 1 NoteEvent
NoteEvent event = new NoteEvent();
Sau đó sử dụng
eventBus.post(event); để gửi event này đi
VD: gửi sự kiện xem note khi clịck vào note
NoteEvent event = new NoteEvent();
event.setNote(note);
event.setEvent(NoteEvent.VIEW);
eventBus.post(event);
Trong EventBus có 1 StickyEvent. điều đặc biệt của nó là khi gửi 1 sự kiện đi. Bất khi ở đâu đăng kí lắng nghe nó đều có thể nhận được mặc dù sự kiện đã gửi đi truớc đó rất lâu.
Trong Note ta áp dụng bằng cách khi edit hoặc thêm mới note ta gửi 1 NoteStickyEvent chứa note và event cần thực hiện. Tại AddEditNote ta cần khai báo lắng nghe NoteStickyEvent như sau
public void onEvent(NoteStickyEvent eventSticky) {
....
}
**** Và để gửi 1 StickyEvent ta sử dụng****
eventBus.postSticky(noteStickyEvent);
****Để hủy bỏ 1 StickyEvent tả hủy chính class NoteStickyEvent ****
eventBus.removeStickyEvent(NoteStickyEvent.class);
****Hoặc có thể hủy mọi StickyEvent bằng ****
eventBus.removeAllStickyEvents();
- Tài liệu và Project Note https://www.dropbox.com/s/gz5oqutgiu6t5ao/PhamQuyHai_EventBus.zip?dl=0
All rights reserved