好久没更新博客了,思来想去,时隔半年又重新了回来了 最近项目更新想用下greenrobot的eventbus,之前都是传统的Intent,Handler,Broadcast...... eventbus出现的很早,只是咱们的项目还木有用上,今天就来看看这个吧
-
官方Eventbus
官方文档 - 啥是EventBus?
EventBus是Android下高效的发布/订阅事件总线机制。作用是可以代替传统的Intent,Handler,Broadcast或接口函数在Fragment,Activity,Service,线程之间传递数据,执行方法。特点是代码简洁,是一种发布订阅设计模式(Publish/Subsribe),或称作观察者设计模式。 - 下载jar包或者直接Androidstudio里面引用
库地址
build.gradle添加引用
compile 'org.greenrobot:eventbus:3.0.0'
-
官方图解
EventBus
- EventBus 角色介绍
Event 传递的事件对象
Subscriber 事件的订阅者
Publisher 事件的发布者
ThreadMode 定义函数在何种线程中执行
- 定义一个事件类型
public class MsgEvent1 {
private String msg;
public MsgEvent1(String msg) {
super();
this.msg = msg;
}
public String getMsg() {
return msg;
}
}
- 订阅者
@Subscribe
public void onMessageEvent(MessageEvent event){
Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
}
@Subscribe
public void handleSomethingElse(SomeOtherEvent event){
doSomethingWith(event);
}
- 注册和解绑EventBus,发送
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
super.onStop();
EventBus.getDefault().unregister(this);
}
发送事件
EventBus.getDefault().post(new MessageEvent("Hello EventBus!"));
EventBus中事件的发送及订阅是通过事件类型,就是上面定义的MessageEvent,由他进行匹配
- EventBus四种线程模式
ThreadMode.POSTING ThreadMode.MAIN ThreadMode.BACKGROUND ThreadMode.ASYNC
- 默认模式
@Subscribe(threadMode = ThreadMode.POSTING)
public void onMessage(MessageEvent event) {
log(event.message);
}
ThreadMode.POSTING:默认使用该模式,表示该方法会在当前发布事件的线程执行
ThreadMode.MAIN:表示会在UI线程中执行
ThreadMode.BACKGROUND:若当前线程非UI线程则在当前线程中执行,否则加入后台任务队列,使用线程池调用
ThreadMode.ASYNC:加入后台任务队列,使用线程池调用
Sticky Events使用方法
如果之前事件使用postSticky进行发布且执行过,则当sticky为true的订阅者再次订阅时,会去stickyEvents去查找事件,然后立即去post执行。
eg:
EventBus.getDefault().postSticky(new MessageEvent("Hello EventBus"));
@Subscribe(sticky = true)
public void onEvent(MessageEvent event) {
textField.setText(event.message);
}
如果使用也可以移除之前发布过的postSticky
eg:
MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);
// Better check that an event was actually posted before
if(stickyEvent != null) {
EventBus.getDefault().removeStickyEvent(stickyEvent);
}
Subscriber Priorities(优先级)
优先级越高越优先执行,默认的优先级为0,priority 设置优先级别,整数,数值越大优先级别越高,则能优先收到订阅消息
@Subscribe(threadMode = ThreadMode.PostThread,priority = 1)
@Subscribe(threadMode = ThreadMode.MainThread,priority = 2)
@Subscribe(threadMode = ThreadMode.BackgroundThread,priority = 3)
@Subscribe(threadMode = ThreadMode.Async,priority = 4)
register
的函数重载中有一个可以指定订阅者的优先级,我们知道EventBus
中有一个事件类型到List<Subscription>的映射,在这个映射中,所有的Subscription是按priority排序的,这样当post事件时,优先级高的会先得到机会处理事件。
优先级的一个应用就事,高优先级的事件处理函数可以终于事件的传递,通过cancelEventDelivery
方法,但有一点需要注意,这个事件的ThreadMode必须是PostThread
,并且只能终于它在处理的事件。
缺点
无法进程间通信,如果一个应用内有多个进程的话就没办法了注意事项及要点
同一个onEvent函数不能被注册两次,所以不能在一个类中注册同时还在父类中注册
当Post一个事件时,这个事件类的父类的事件也会被Post。
Post的事件无Subscriber处理时会Post NoSubscriberEvent
事件,当调用Subscriber失败时会Post SubscriberExceptionEvent
事件。
@Subscribe(priority = 1);
public void onEvent(MessageEvent event) {
//逻辑处理
}
EventBus
中还有个Util包,主要作用是可以通过AsyncExecutor
执行一个Runnable,通过内部的RunnableEx(可以搜索异常的Runnable)当Runnable抛出异常时通过EventBus
发消息显示错误对话框