EventBus: Events for Android

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/