简介
EventBus是一种用于Android的发布/订阅事件总线。它有很多优点:简化应用组件间的通信;解耦事件的发送者和接收者;避免复杂和容易出错的依赖和生命周期的问题;很快,专门为高性能优化过等等。
基本使用
准备工作
创建一个工具类,里面封装了一些基本方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18public class EventBusUtil {
public static void register(Object subscriber) {
EventBus.getDefault().register(subscriber);
}
public static void unregister(Object subscriber) {
EventBus.getDefault().unregister(subscriber);
}
public static void sendEvent(Event event) {
EventBus.getDefault().post(event);
}
public static void sendStickyEvent(Event event) {
EventBus.getDefault().postSticky(event); //后续注册的订阅者依然可以从内存中得到这个已发送的sticky事件
}
}创建一个基本事件类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26public class Event<T> {
private int code; //该字段用于判断事件的发送源
private T data; //事件类型
public Event(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;
}
}封装到基类(BaseActivity、BaseFragment)
1
2
3
4
5
6
7
8/**
* 是否注册EventBus,注册后才可以订阅事件
*
* @return true表示绑定EventBus事件分发,默认不绑定,子类需要绑定的话复写此方法返回true.
*/
protected boolean isRegisterEventBus() {
return false;
}
在onCreated方法中加入1
2
3if (isRegisterEventBus()) {
EventBusUtil.register(this);
}
在onDestroy方法中加入1
2
3if (isRegisterEventBus()) {
EventBusUtil.unregister(this);
}
在代码中使用
- 接收事件
例如某个Activity要接收事件,则其首先要注册Eventbus1
2
3
4
protected boolean isRegisterEventBus() {
return true;
}
然后写一个接收事件的方法1
2
3
4
5
6
7
8
9
10
11 (threadMode = ThreadMode.MAIN)
public void onEventCome(Event<MainEvent> event) {
switch (event.getCode()) {
case EventBusCode.Login2Main:
case EventBusCode.Register2Main:
updateAfterLoginOrRegister(event.getData().getUserName()); //更新用户信息
break;
default:
break;
}
}
EventBusCode是用来区分不同活动发来的事件1
2
3
4public class EventBusCode {
public static final int Register2Main = 0;
public static final int Login2Main = 1;
}
- 发送事件
例如在登录活动中发送一个事件给主活动1
2
3//更新用户信息
Event<MainEvent> mainEvent = new Event<>(EventBusCode.Login2Main, new MainEvent(userName));
EventBusUtil.sendEvent(mainEvent);
发送黏性事件
所谓的黏性事件,就是指发送了该事件之后再注册的订阅者依然能够接收到的事件。简单来说就是可以把事件发送到未启动的活动中。
使用
在订阅事件处添加 sticky = true属性
1
2
3
4
5
6
7
8
9
10
11true) (threadMode = ThreadMode.MAIN, sticky =
public void onStickyEventBusCome(Event<ShowArticleEvent> event) {
switch (event.getCode()) {
case EventBusCode.Home2ShowArticle:
mLink = event.getData().getLink();
mTitle = event.getData().getTitle();
break;
default:
break;
}
}发布事件处发送黏性事件
1
EventBusUtil.sendStickyEvent(event);