EventBus: Events for Android
Bài đăng này đã không được cập nhật trong 3 năm
EventBus: Events for Android
1. Thêm EventBus vào project
Hướng dẫn Ta thêm vào build.gradle file:
compile 'org.greenrobot:eventbus:3.0.0'
2. Các bước để bắt đầu với EventBus
2.1. Khởi tạo Event
Ví dụ ta khởi tạo NoteEvent như sau :
package tuananh.com.eventbus;
/**
* Created by framgia on 27/06/2017.
*/
public class NoteEvent {
private String mNote;
public NoteEvent(String note) {
mNote = note;
}
public String getNote() {
return mNote;
}
}
2.2. Prepare subscribers
2.2.1. Đăng ký
Đăng kí subscriber trong event bus với hàm register(). Nó sẽ xác nhận với EventBus rằng bạn muốn lắng nghe các sự kiện. Trong một Activity, bạn sẽ gọi trong onStart(), trong khi ở fragment, bạn sẽ gọi nó trong onAttach(Activity)
@Override
protected void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
2.2.2. Hủy đăng ký
Hủy đăng kí subcriber, có nghĩa là nói với EventBus ngưng gửi cho mình các sự kiện, gọi hàm unregister(). Trong Activity bạn sẽ gọi trong onStop(), còn trong fragment sẽ gọi trong hàm onDetach() :
@Override
protected void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
2.2.3. onEvent()
Implement lại hàm onEvent() để xác định loại event bạn muốn nhận và kiểu action khi nhận được.
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onEvent(NoteEvent noteEvent) {
mBinding.textNote.setText(noteEvent.getNote());
}
2.3. Post events
Có 2 loại post là Post Event and Post Sticky Event Sự khác biệt chính giữa post event và post sticky event là cơ chế bộ nhớ đệm sử dụng bên trong EvenBus.
Khi một thành phần nào đó post một sticky event, event này sẽ được lưu lại trong bộ nhớ đệm. Khi một Activity mới hoặc một Fragment mới theo dõi sự kiện, EventBuss sẽ lấy ra sticky event gần đây nhất trong bộ nhớ đệm thay vì thực hiện lại đăng kí một event mới, cho nên event này vẫn nằm trong bộ nhớ đệm sau khi subcriber đã nhận được nó.
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_show);
int typePost = getIntent().getIntExtra("typePost", 0);
switch (typePost) {
case 0:
// non-sticky event
EventBus.getDefault().post(new NoteEvent("non-sticky event"));
break;
default:
// postSticky
EventBus.getDefault().postSticky(new NoteEvent("postSticky"));
break;
}
3. Theo dõi 1 Sticky Event
Để theo dõi một sticky event, bạn thêm sticky = true bên trong the @Subscribe. Nó chỉ ra rằng bạn muốn nhận một sticky event của MessageEvent từ bộ nhớ đệm.
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onEvent(NoteEvent noteEvent) {
mBinding.textNote.setText(noteEvent.getNote());
}
4. Xóa bỏ Sticky Events
C1: EventBus.getDefault().removeStickyEvent(Object event) -> Xóa 1 stickyEvent cụ thể C2: EventBus.getDefault().removeAllStickyEvents(); -> Xóa hết stickyEvent C3: EventBus.getDefault().removeStickyEvent(Class<T> eventType) -> Remove and gets the recent sticky event for the given event type.
Source Code : Tài liệu tham khảo : http://www.andreas-schrade.de/2015/11/28/android-how-to-use-the-greenrobot-eventbus/ http://greenrobot.org/eventbus/
All rights reserved