快来,一站式带你了解EventBus!

EventBus详解

利用很少的代码,来实现多组件间通信.

使用EventBus,主要的就是三个方面:

  1. 订阅者(Subscriber)的register,unregister

  2. 发布者(publisher)通过post,postSticky方法发送事件

  3. 通过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) {
        //监听到这个事件后的具体操作
    } 
}

创建的这个方法是有要求的。要求有如下几点。

  1. 该方法有且只有一个参数。

  2. 该方法必须是public修饰符修饰,不能用static关键字修饰,不能是抽象的(abstract)

  3. 该方法需要用@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);

猜你喜欢

转载自blog.csdn.net/luoro/article/details/126478314