使用EventBus在Activity和fragment之间传递数据,出现post一次,却接收到多次对应事件

背景

项目中有一个activity,其中通过viewpager管理着多个页面,在activity操作某些数据时,通过eventbus将消息传递给fragment。

该fragment中,分别在onViewCreated注册了eventbus

if (!EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().register(this);
}

在onDestroyView中解注册了eventbus

if (EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().unregister(this);
}

出现状况:当我在activity中post了一次数据,在该fragment中实际接收到了两次,且间隔时间极短

 因为收到个消息后,fragment会根据当前fragment的view中各按钮的状态(比如单选框)来确定下发的接口参数,我通过日志发现,收到两次event消息后实际发出的接口参数还不一样,也就是说fragment的view状态其实是不一样的。

第二次发出的接口参数才是用户的真实意图,即第二次拿到的按钮状态才是正确的.

其它信息:

该activity管理4个fragment,而接收消息的fragment处于第1个,而且只有接收消息fragment可见时,activity的按钮才会展示(点击该按钮才会通过eventbus post对应事件)

该activity的viewpager设置了setOffscreenPageLimit(2),按理说这个值没影响,本来该fragment已经可见了,不存在预加载问题。

这个问题是偶现的

 

修改

目前初步能想到的修改方式有两种

1.目前没有找到确切原因,但从刚才分析结果来看,两次接收到消息的时差在0.02s,在这极短时间内获取fragment的view状态其实是不一致的,如果我们在post时做一个延时(比如200ms),即使一次post出去后fragment接收到两次,此时fragment的状态也应该一致了,最多就下发两次相同值的接口数据。这种修改方式待验证,后面有思路再优化,欢迎讨论

 2.既然我们的activity管理着fragment,那么我们直接将之前收到消息后的处理,改为在fragment中定义一个方法A去实现,然后在activity中之前要post的地方通过直接调用fragment的该方法A

 

 


posted @ 2024-06-21 10:51  瓜的呱  阅读(202)  评论(0)    收藏  举报