一、概述
Android组件间、线程间的通信,可以用Handler,BroadcastReceiver,回调等方法来实现,但是这些方法的实现有些繁琐。EventBus可以完成以上所有功能,并采用了“订阅/发布模式”,使代码更优雅、更好的解耦。相似的框架还有Otto、RxBus等,今天先来讲讲EventBus的基本使用。
二、实战
添加依赖
compile 'org.greenrobot:eventbus:3.0.0'
发送广播
1.将需要发送的数据封装成类
public class EventType {
private int type;
public EventType(int type) {
this.type = type;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
}
2.发送数据
- 发送普通广播
EventBus.getDefault().post(new EventType(6666));
post(Object event)参数必须与接收方法的参数类型相同,也就是需要发送的数据。不懂这句话没关系,下面会提到。
- 发送粘性广播
EventBus.getDefault().postSticky(new EventType(6666));
PS:粘性广播是指当接收事件还没创建之前,发送方发出的最后一个广播。
接收广播
1.注册
@Override
protected void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
2.注销
@Override
protected void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
3.接收方法
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true, priority = 100)
public void showData(EventType eventType){
Log.d(TAG, "showData: ");
}
用@Subscribe注解来标识接收事件的方法,@Subscribe(ThreadMode threadmode, boolean sticky, int priority)的三个参数都是可选参数。
1. 参数1:用于指定接收方法执行在哪个线程中,默认为POSTING。
POSTING:与发送事件处于同一线程
MAIN:执行在主线程
BACKGROUND:执行在子线程,如果发送事件在子线程中,那么接收事件也会执行在此线程中
ASYNC:执行在新建的子线程,用于执行耗时操作
2. 参数2:是否接收粘性广播,默认为false。
3. 参数3:接收事件的优先级,默认为0。数越大,优先级越高。只有当多个接收事件处于同一线程中,优先级才会起作用。
注意:
1.接收方法的方法名随意,但参数类型必须与发送方法post()的参数相同。
2.接收方法不能被private修饰。
取消/拦截广播
EventBus.getDefault().cancelEventDelivery(new EventType(6666));
cancelEventDelivery(Object)取消广播,Object是消息内容。
只有当threadMode为POSTING时,才会取消广播。
三、原理
EventBus.getDefault().register(this);
在注册这个类的时候,会用一个集合记录这个类和这个类订阅的方法
EventBus.getDefault().unRegister(this);
在注销这个类的时候,会用在原来集合里删除这个类和这个类订阅的方法
EventBus.getDefault().post(this);
在发送广播时,筛选出与发送事件的实参类型相同的接收方法,再调用这些方法
EventBus最终是利用注解加反射来实现的。