EvenBus trong Android
Bài đăng này đã không được cập nhật trong 3 năm
Evenbus là gì ?
EventBus đã được giới thiệu trong Google IO 2013. EvenBus là thư viện làm đơn giản giao tiếp giữa các phần trong ứng dụng của bạn. Ví dụ, để gửi dữ liệu từ Activity tới Service đang chạy, hoặc gửi dữ liệu giữa các Fragment. Thông thường chúng ta hay truyền thông qua Intent, nhưng hôm nay chúng ta sẽ xây dựng một ứng dụng đơn giản sử dũng EventBus.
Ưu điểm và nhược điểm !
Ưu điểm : Tốc độ truyền nhanh hơn và cách viết đơn giản hơn khi sủ dụng Intent. 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. Bắt sự kiện và lấy kết quả của quá trình đó tại bất kì đâu Activity, Fragments..... Tránh được tình trạng Overload Thread, tràn bộ nhớ đệm, thiếu bộ nhớ dẫn đến giảm hiệu suất của chương trình khi có quá nhiều even trao đổi dữ liệu cùng diễn ra. 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)
Cài đặt.
Sử dụng EvenBus gồm 4 bước sau :
Bước 1. Tạo phương thức để năng nghe sự kiện
Bước 2. đăng ký lắng nghe sự kiện
Bước 3. Gửi sự kiện
Bước 4. Hủy lắng nghe sự kiện
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
Cùng thử một ví dụ đơn giản để hiểu hơn EvenBus nào : Bài toán: Fragment A cho người dùng nhập 2 số nguyên dương rồi gửi qua Fragment B. Fragment B nhận , tính tổng và hiển thị kết quả
Ở nơi truyền dữ liệu :
NumberData data = new NumberData(Integer.parseInt(edit1.getText().toString()),
Integer.parseInt(edit2.getText().toString()));
EventBus.getDefault().post(data);
Ở nơi nhận dữ liệu
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().registerSticky(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
public void onEventMainThread(NumberData data) {
int result = data.getNumber1() + data.getNumber2();
mTextResult.setText("Result : "+result);
}
Thanks for all !
All rights reserved