前述
虽然该库已经停止维护了,但是因为它注册监听的便捷,所以项目中还是用到了该库。想当初刚使用该库时候的方便,真真是乐不思蜀啊!功能就不赘述了,都停止维护还在研究这个就有点尬尴了。
问题描述
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
,- 获取到
tag
及method
的入参类型,封装成EventType eventType
对象(以供后期消息分发) - 获取到
mode
,把method
、eventType
、mode
封装成TargetMethod subscribeMethod
,再将subscriber
跟subscribeMethod
封装成Subscription newSubscription
(以供消息分发后调用method
来执行方法) - 以
eventType
- 获取到