快来,一站式带你了解EventBus!
EventBus详解
利用很少的代码,来实现多组件间通信.
使用EventBus,主要的就是三个方面:
- 订阅者(Subscriber)的register,unregister
- 发布者(publisher)通过post,postSticky方法发送事件
- 通过subscriber注解定义的方法来接收事
使用方法
1.创建一个事件类型,消息事件类型可以是string,int等常见类,也可以是自己自定义一个事件类,方便管理。
public class MessageEvent {
public static final int MESSAGE_UPDATE_MINE_SCENE_LIST = 0;
public static final int MESSAGE_GUIDE_PRESET_SCENE = 1;
public static final int MESSAGE_GUIDE_TO_MINE_SCENE = 2;
public static final int MESSAGE_GUIDE_MINE_SCENE_MANAGE = 3;
public static final int MESSAGE_GUIDE_ADD_SCENE = 4;
public static final int MESSAGE_GUIDE_DONE = 5;
public static final int MESSAGE_JUMP_AND_UPDATE_MINE_SCENE = 6;
public static final int MESSAGE_PUSH_UPDATE_SCENE_ACTIVE_STATUS = 7;
public final String mMessage;
public final int mCode;
public final int mSceneId;
public static MessageEvent getInstance(String message, int code) {
return new MessageEvent(message, code);
}
private MessageEvent(String message, int code) {
mMessage = message;
mCode = code;
mSceneId = 0;
}
private MessageEvent(String message, int code, int sceneId) {
mMessage = message;
mCode = code;
mSceneId = sceneId;
}
}
2、在需要订阅事件的模块中,注册eventbus和取消eventbus
@Override
protected void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
关于EventBus的注册问题,说几点。
注册完了,在不用的时候千万别忘了unregister。
不能重复注册。注册之后,没有unregister,然后又注册了一次。
register与unregister的时间根据实际需求来把控,官方的例子是在onStart()回调方法进行注册,onStop()回调方法进行unregister(),这边根据需求做了改动。
3、在需要接受事件的类中进行好register之后,需要在该类中创建一个方法来接收事件消息。
@SuppressWarnings("all")
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
if (event == null) {
return;
}
if (event.mCode == MessageEvent.MESSAGE_GUIDE_TO_MINE_SCENE) {
//监听到这个事件后的具体操作
} else if (event.mCode == MessageEvent.MESSAGE_GUIDE_ADD_SCENE) {
//监听到这个事件后的具体操作
}
}
创建的这个方法是有要求的。要求有如下几点。
- 该方法有且只有一个参数。
- 该方法必须是public修饰符修饰,不能用static关键字修饰,不能是抽象的(abstract)
- 该方法需要用@Subscribe注解进行修饰。
4、在需要发送事件的地方,调用EventBus的post(Object event),postSticky(Object event)来通知订阅者。
EventBus.getDefault().post(MessageEvent.getInstance(data,
MessageEvent.MESSAGE_UPDATE_MINE_SCENE_LIST));
EventBus的内存泄露
eventBus注册的时候会持有activity的引用,我们在onDestroy反注册。若我们的activity发生异常或系统内存不足对activity强制回收的时候将不会走onDestroy。eventBus持有activity的引用,因此发生内存泄漏。而且当我们再次打开activity时eventBus又会重新注册一次。
解决办法:注册的时候先判断activity是否注册过
if (!EventBus.getDefault().isRegistered(this)) EventBus.getDefault().register(this);
还没有评论,来说两句吧...