EventBus 是一个 Android 事件发布/订阅框架,通过解耦发布者和订阅者简化事件传递。既可以用于 Android 四大组件间的通讯,也可以用于异步线程和主线程间的通讯,支持指定事件处理的线程和优先级,可以发送与粘性广播类似的粘性事件。代码简洁,容易上手。
项目地址:EventBus
为了提高代码的易用性,我们在使用 EventBus 的时候再进行一层封装,公共的部分放在 BaseActivity 或者 BaseFragment 里面,需要注册事件的子类,覆盖相应的方法就可以。
public abstract class BaseActivity extends FragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayoutResID());
if (isRegisteredEventBus()) {
EventBusUtils.register(this);
}
initView();
initData();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (isRegisteredEventBus()) {
EventBusUtils.unregister(this);
}
release();
}
/**
* 获取布局
*
* @return 布局 ID
*/
protected abstract int getLayoutResID();
/**
* 初始化视图
*/
protected void initView() {
}
/**
* 初始化数据
*/
protected void initData() {
}
/**
* 释放资源
*/
protected void release() {
}
/**
* 是否注册事件分发
*
* @return true 注册;false 不注册,默认不注册
*/
protected boolean isRegisteredEventBus() {
return false;
}
/**
* 接收到分发的事件
*
* @param event 事件
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void onReceiveEvent(EventMessage event) {
}
/**
* 接受到分发的粘性事件
*
* @param event 粘性事件
*/
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onReceiveStickyEvent(EventMessage event) {
}
}
简言之,在 Activity 创建的时候,根据标识确定是否注册 EventBus,然后在销毁的时候解除注册。这里有两个处理事件的方法,分别处理普通事件和粘性事件,在主线程执行。如有需要,可以自行扩展其他方法。
public class EventBusUtils {
private EventBusUtils() {
}
/**
* 注册 EventBus
*
* @param subscriber
*/
public static void register(Object subscriber) {
EventBus eventBus = EventBus.getDefault();
if (!eventBus.isRegistered(subscriber)) {
eventBus.register(subscriber);
}
}
/**
* 解除注册 EventBus
*
* @param subscriber
*/
public static void unregister(Object subscriber) {
EventBus eventBus = EventBus.getDefault();
if (eventBus.isRegistered(subscriber)) {
eventBus.unregister(subscriber);
}
}
/**
* 发送事件消息
*
* @param event
*/
public static void post(EventMessage event) {
EventBus.getDefault().post(event);
}
/**
* 发送粘性事件消息
*
* @param event
*/
public static void postSticky(EventMessage event) {
EventBus.getDefault().postSticky(event);
}
}
这里统一使用 EventBusUtils 注册和发送事件,封装库的好处就是以不变应万变,比如源码 post 方法有改动,我们更改这一处就好,省时又省力。
public class EventMessage<T> {
private int code;
private T data;
public EventMessage(int code) {
this.code = code;
}
public EventMessage(int code, T data) {
this.code = code;
this.data = data;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
@Override
public String toString() {
return "EventMessage{" +
"code=" + code +
", data=" + data +
'}';
}
}
所有要发送的消息使用 EventMessage 传递,根据 code 确定消息类型,data 则是传递的数据部分,所有的统一都是为了容易处理。
public class EventCode {
public static final int EVENT_A = 1000;
public static final int EVENT_B = 1001;
}
code 作为事件的区分,定义成常量,最好是根据模块来划分,这样容易管理和分类。
EventBusUtils.post(new EventMessage<>(EventCode.EVENT_A, "EventData"));
使用起来就是这么容易,事件订阅者根据 code 做出相应的处理,整个过程如行云流水般,潇洒畅快~