记一次AndroidEventBus的源码之旅:为何我的监听执行两次

前述

    虽然该库已经停止维护了,但是因为它注册监听的便捷,所以项目中还是用到了该库。想当初刚使用该库时候的方便,真真是乐不思蜀啊!功能就不赘述了,都停止维护还在研究这个就有点尬尴了。

问题描述

    post一个消息,Subscriber注解的方法总是执行两次。问题描述起来就很简单了,那是因为我并没有描述在网上寻找原因跟解决方案的艰辛,并且并未找到同样的问题,也隐藏了导致这个原因的重要细节描述,伪代码贴出来看大家是否知道是什么问题:

//监听:
@Subscriber(tag = "tag")
public void onXXX(Map<String, String> obj) {
    //...
}

//发送消息
HashMap<String, String> params = new HashMap<>();
params.put("aaa", "aaa");
params.put("bbb", "bbb");
EventBus.getDefault().post(params, "tag");
复制代码
解决方案

    解决方法就是吧@Subscriber注解的方法入参由Map改成HashMap就好了。这个问题按说把发送跟接收的数据类型统一就可以避免,但为什么会执行两次,如果压根就接收不到那也会比较早的发现问题了。为了能睡个安稳觉,也要把根本原因找到。(为了不耽误不想看我废话的朋友的时间,先把解决方法告诉大家,下面来看看原因)

源码追踪

    既然已经说了是废话了,那还是啰嗦一点。监听跟分发肯定是分两步走的,我们也分两个步骤走:

步骤一:注册

当通过 EventBus.register(Object subscriber)注册对象后,SubsciberMethodHunter类做如下操作:

  • 通过遍历subscriber里所有通过@Subscriber(tag="tag",mode=ThreadMode mode)注解的方法Method method
    • 获取到tagmethod的入参类型,封装成EventType eventType对象(以供后期消息分发)
    • 获取到mode,把methodeventTypemode封装成TargetMethod subscribeMethod,再将subscribersubscribeMethod封装成Subscription newSubscription(以供消息分发后调用method来执行方法)
    • eventType
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值