根据github上文档的介绍来看看EventBus是如何使用的
一、3步实现EventBus
添加依赖
compile 'org.greenrobot:eventbus:3.0.0'
1、定义事件
public class MessageEvent{
//添加你需要的字段
public final String message;
public MessageEvent(String message) {
this.message = message;
}
}
2、初始化订阅者
当发送订阅消息时,回调的方法
// This method will be called when a MessageEvent is posted (in the UI thread for Toast)
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
}
// This method will be called when a SomeOtherEvent is posted
@Subscribe
public void handleSomethingElse(SomeOtherEvent event) {
doSomethingWith(event);
}
在生命周期中register和unregister
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
3、发送事件
EventBus.getDefault().post(new MessageEvent("Hello everyone!"));
二、EventBus中的4中ThreadMode
1、ThreadMode.POSTING
事件的处理在和事件的发送在相同的进程,所以事件处理时间不应太长,不然影响事件的发送线程,而这个线程可能是UI线程.
@Subscribe(threadMode = ThreadMode.POSTING) // ThreadMode is optional herepublic void onMessage(MessageEvent event) {
log(event.message);
}
2、ThreadMode: MAIN
事件的处理会在UI线程中执行,事件处理不应太长时间
// Called in Android UI's main thread
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage(MessageEvent event) {
textField.setText(event.message);
}
3、ThreadMode.BACKGROUND
事件的处理会在一个后台线程中执行,尽管是在后台线程中运行,事件处理时间不应太长。如果事件分发在主线程,件会被加到一个队列中,由一个线程依次处理这些事件,如果某个事件处理时间太长,会阻塞后面的事件的派发或处理。如果事件分发在后台线程,事件会立即执行处理。
// Called in the background thread
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onMessage(MessageEvent event){
saveToDisk(event.message);
}
4、ThreadMode.ASYNC
事件处理会在单独的线程中执行,主要用于在后台线程中执行耗时操作,每个事件会开启一个线程(有线程池),但最好限制线程的数目。
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onMessage(MessageEvent event){
backend.send(event.message);
}
三、StickyEvents 粘性事件
在Android开发中,Sticky事件指事件消费者在事件发布之后才注册的也能接收到该事件的特殊类型。
首先,发送一条粘性事件
EventBus.getDefault().postSticky(new MessageEvent("Hello everyone!"));
在事件发送完毕后,新打开了一个页面,在这个页面中注册EventBus,订阅以及分发粘性事件
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onEvent(MessageEvent event) {
// UI updates must run on MainThread
textField.setText(event.message);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
获取和移除粘性事件
当订阅者订阅粘性事件的时候,会自动去匹配最近的发送的粘性事件,但有时,为了更方便的手动检查粘性事件,我们需要获取,移除粘性事件,这样事件就不会被分发了。
举个栗子:
获取当前事件,并删除它;
MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);
// Better check that an event was actually posted before
if(stickyEvent != null) {
// "Consume" the sticky eventEventBus.getDefault().removeStickyEvent(stickyEvent);
// Now do something with it
}
删除并返回当前事件
MessageEvent stickyEvent = EventBus.getDefault().removeStickyEvent(MessageEvent.class);
// Better check that an event was actually posted before
if(stickyEvent != null) {
// Now do something with it
}
四、Priorities and Event Cancellation 优先级和事件取消
事件的优先级类似广播的优先级,在相同分发线程中,优先级越高优先获得消息,默认优先级是0;
@Subscribe(priority = 1);
public void onEvent(MessageEvent event) {…}
EventBus.getDefault().cancelEventDelivery(event) ;//优先级高的订阅者可以终止事件往下传递
五、Subscriber Index 订阅者索引
Subscriber Index是EventBus3以后出来的新特性,
网友评论