EventBus: Events for Android
EventBus: Events for Android Hướng dẫn Ta thêm vào build.gradle file: compile 'org.greenrobot:eventbus:3.0.0' 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 ...
EventBus: Events for Android
Hướng dẫn Ta thêm vào build.gradle file:
compile 'org.greenrobot:eventbus:3.0.0'
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; }
Để 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()); }
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 :