背景
项目中有一个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处于第2个,而且只有接收消息fragment可见时,activity的按钮才会展示(点击该按钮才会通过eventbus post对应事件)
该activity的viewpager设置了setOffscreenPageLimit(2),按理说这个值没影响,本来该fragment已经可见了,不存在预加载问题。
这个问题是偶现的
修改:
目前没有找到确切原因,但从刚才分析结果来看,两次接收到消息的时差在0.02s,在这极短时间内获取fragment的view状态其实是不一致的,如果我们在post时做一个延时(比如200ms),即使一次post出去后fragment接收到两次,此时fragment的状态也应该一致了,最多就下发两次相同值的接口数据。后面有思路再优化,欢迎讨论
标签:fragment,Activity,getDefault,activity,传递数据,post,接收,EventBus From: https://www.cnblogs.com/terrorists/p/18260044