EventBus的使用
(publish/subscribe)
**
一.配置
**
打开App的build.gradle,在dependencies中添加最新的EventBus依赖:
compile ‘org.greenrobot:eventbus:3.0.0’
通过索引加速,首先在项目gradle的dependencies中引入apt编译插件:
classpath ‘com.neenbedankt.gradle.plugins:android-apt:1.8’
然后在App的build.gradle中应用apt插件,并设置apt生成的索引的包名和类名:
apply plugin: ‘com.neenbedankt.android-apt’
apt {
arguments {
eventBusIndex “com.study.sangerzhong.studyapp.MyEventBusIndex”
}
}
接着在App的dependencies中引入EventBusAnnotationProcessor:
apt ‘org.greenrobot:eventbus-annotation-processor:3.0.1’
二.获取单例
EventBus默认有一个单例,可以通过 getDefault() 获取,也可以通过 EventBus.builder() 构造自定义的EventBus,比如要应用我们生成好的索引时:
EventBus mEventBus = EventBus.builder().addIndex(new MyEventBusIndex()).build();
如果想把自定义的设置应用到EventBus默认的单例中,则可以用 installDefaultEventBus() 方法:
EventBus.builder().addIndex(new MyEventBusIndex()).installDefaultEventBus();
1.EventBus bus=EventBus.getDefault();
2.EventBus bus=EventBus
.builder()
.addIndex(new MyEventBusIndex())
.build();
3.EventBus.builder().addIndex(new MyEventBusIndex()).installDefaultEventBus();
一般需要写一个工具类:
/**
* shark
* 注册 解除注册 发送对象
*/
public class EventUtil {
public static void register(Object context) {
if (!EventBus.getDefault().isRegistered(context)) {
EventBus.getDefault().register(context);
}
}
public static void unregister(Object context) {
if (EventBus.getDefault().isRegistered(context)) {
EventBus.getDefault().unregister(context);
}
}
public static void post(Object object) {
EventBus.getDefault().post(object);
}
public static void postSticky(Object object) {
EventBus.getDefault().postSticky(object);
}
}
三.定义事件
public class MyEvent {
private String msg;
public MyEvent(String msg) {
this.msg = msg;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
**
四.监听事件
**
监听方法需要用public修饰,否则会报错误。
首先把作为订阅事件的模块通过EventBus注册监听:(oncreate()方法中)
mEventBus.register(this);
通过注解的方式监听
@Subscribe(threadMode = ThreadMode.POSTING, priority = 0, sticky = true)public void handleEvent(DriverEvent event) {
Log.d(TAG, event.info);
}
优先级
其实和broadcast一个道理,一般为0—-100 ,数值越大,优先级越高,当然也优先级高的接受者可以拦截事件,
EventBus.getDefault().cancelEventDelivery(event) ;//优先级高的订阅者可以终止事件往下传递
有四种线程模式:
1.
POSTING(在调用post所在的线程执行回调):不需要poster来调度,直接运行。
2.
MAIN(在UI线程回调):如果post所在线程为UI线程则直接执行,否则则通过mainThreadPoster来调度。
3
BACKGROUND(在Backgroud线程回调):如果post所在线程为非UI线程则直接执行,否则则通过backgroundPoster来调度。
4
ASYNC(交给线程池来管理):直接通过asyncPoster调度。
他们有啥子用呢,其实就是告诉你只有在主线程中才能更新UI,主线程中不要做耗时操作,如果有必要需要和handler一起使用
这个事件队列是一个链表,由一个个PendingPost组成,其中包含了事件,事件订阅者,回调方法这三个核心参数,以及需要执行的下一个PendingPost。
**
注册流程
**
**
Post流程
**
**
五 EventBus粘性事件
**
我们在学广播的时候有一种广播叫粘性广播。如果使用普通广播send一个消息,然后在你的onReceive中执行超过10秒的话,这个广播的状态就会变为可以被干掉的状态,而粘性广播不受限制。
而粘性事件:当你发送消息的时刻和注册消息接收的时刻 并不能确定顺序,比如你请求网络数据和订阅事件 同时执行,如果数据返回的特别快呀快,那你 EventUtil.register(this)这句代码还没执行完呀,这时候你就就收不到这个消息了
注册粘性事件
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true) //在ui线程 执行 public void onDataSynEvent(DataSynEvent event) { }
发送粘性事件
EventBus.getDefault().postSticky(new TestEvent());
注销粘性事件
EventBus.getDefault().removeStickyEvent(new TestEvent());//移除一个 EventBus.getDefault().removeAllStickyEvents();//移除全部