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

本文详细介绍了Android中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);

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值