EventBus 3.0 事件公交车

EventBus 3.0 使用方法以及使用过程中遇到的一些问题
嗯~本人为Android萌新程序猿一枚
这是我在博客写的第一篇文章,怀着忐忑的心情终于落笔了
各位来自天南海北的再生父母们,喜欢的话可以加个关注,点个赞(能打赏的话那真的是给您磕头了),谢谢铁汁🚪
好了,废话不多说,直接开冲



EventBus简介
EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。

使用方法
第一步当然是添加依赖啦:
api 'org.greenrobot:eventbus:3.1.1'
添加完依赖之后就可以直接使用啦,但是为了方便使用,我对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);
    }


    /**
     * 销毁粘性事件
     * @param event
     */
    public static void removeSticky(EventMessage event) {
        EventBus.getDefault().removeStickyEvent(event);
    }
}
相对应的,EventMessage则是我对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 +
                '}';
    }
}
因为我在进行数据传输的时候,是根据code去判断到底是哪个事件的,所以我这里对各种事件相对应的code也进行了统一的处理,形成了一个常量池EventCode
public class EventCode {
    public static final int SUCCESS = 0x000001;// 成功
    public static final int ERROR = 0x000002; // 失败
    public static final int COMPLETE = 0x000003; // 完成
}


好了,准备工作完毕,接下来进行下一步的封装(没错,我就是封装狂魔)

相信大家在做Android app的时候都有一个自己写的继承了AppCompatActivity的基础activity(我这里叫BaseActivity),在BaseActivity里我们可以编写我们需要的常用抽象方法,然后在以后的子activity里面就可以重写这些抽象类啦,我在BaseActivity里面对EventBus事件的分发进行了封装
/**
     * 是否注册事件分发
     *
     * @return true 注册;false 不注册,默认不注册
     */
    protected boolean isRegisteredEventBus() {
        return false;
    }

然后在onCreate和onDestory里面分别对EventBus进行注册(register)和注销(unregister)
@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        // EventBus事件注册
        if (isRegisteredEventBus()) {
            EventBusUtils.register(this);
        }
    }


@Override
    public void onDestroy() {
        super.onDestroy();
        
        // EventBus事件注销
        if (isRegisteredEventBus()) {
            EventBusUtils.unregister(this);
        } 
    }


准备工作终于做完了,接下来就是非常非常简单的使用了!(多图预警)
点击发送按钮,将数据传回上一个界面


EventBusUtils.post(new EventMessage(EventCode.SUCCESS, "老八秘制小憨包"));


在中间的文本框内接收并显示传回的数据


/**
     * 在这个页面对EventBus进行注册
     *
     * @return
     */
    @Override
    protected boolean isRegisteredEventBus() {
        return true;
    }

    /**
     * 接收数据
     *
     * message.getCode()就是事件对应的标识
     * message.getData()就是传回的数据信息
     *
     * @param message
     */
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void eventBusMessage(EventMessage message) {
        switch (message.getCode()) {
            case EventCode.SUCCESS:
                tvReceiveMessage.setText(message.getData().toString());
                break;
        }
    }
上面是对于非粘性事件的处理,好了,一定有小伙伴要问了,什么叫粘性事件,什么叫非粘性事件(普通事件),我这边粘一段比较官方的说法:
粘性事件是指:发布者发送事件的动作发生在订阅者订阅该事件的动作之前,订阅者在订阅之后,仍然可以处理该事件。
我个人理解粘性事件和普通事件就是:要是你数据传输的时候,你要接收数据的那个页面不存在,那么就用postSticky;要是你进行数据传输的时候,接收数据的页面存在了,那么就是普通事件,用post即可;
没错,就是这么肤浅!(理直气壮)

这边我也粘一段有关粘性事件传输的代码,关键来了
⚠️ 注意:粘性事件在接收的时候一定要加 sticky = true ,在事件接收之后,一定要removeSticky!!!
EventBusUtils.postSticky(new EventMessage(EventCode.ERROR, "老七蜜汁小憨包"));
/**
     * EventBus事件注册
     * @return
     */
    @Override
    protected boolean isRegisteredEventBus() {
        return true;
    }

    /**
     * sticky = true  粘性事件,一定不要忘记
     * removeSticky,移除数据,重中之重
     * 
     * @param message
     */
    @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
    public void eventBus(EventMessage message) {
        switch (message.getCode()) {
            case EventCode.ERROR:
                tvReceiveMessage.setText(message.getData().toString());
                // 一定要记得remove
                EventBusUtils.removeSticky(message);
                break;
        }
    }

我是分割线
小结:
1.接收数据的页面不存在的话就用postSticky(粘性事件),存在就用post(普通事件)
2.粘性事件在接收处理数据之前记得加sticky = true ,事件完成之后一定要removeSticky
3.使用EventBus之前一定记得注册,完成之后一定记得注销,这是重中之重!!!(要是你代码写完之后,程序跑起来了,结果数据死活就是拿不到,也没报错,那么,十有八九,就是你没用注册~)


不知不觉又到了该说再见的时候(手动狗头🐶),怀着忐忑的心情写下这些结束语(手动狗头🐶),作为一个Android开发还没入门的程序员来说,我写下这篇博文的初心是为了警告自己, EventBus使用的时候,要是没拿到数据,一定要先检查是否注册,我真的被这个坑了好多次了(太傻逼了)。写这篇文章也是为了大家能够更方便的使用EventBus,同时也警告大家一定要记得注册🐶
话不多说,要是我什么地方写的有问题,请大家一定要给我指出,我会努力思考并改正的,毕竟咱只是一个平平无奇的Android小废柴,还请大家多多关照,多多指教


好了,下期我会给铁汁们整一个有关BackgroundLibrary类库(通过标签直接生成shape,无需再写shape.xml)的使用方法,再见~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值