EventBus3.0Fragment中使用的问题
前言:
最近使用项目中使用EventBus,其中有一个Activity中使用ViewPager加载三个Fragment,由于存在传值的需求,并没有采用直接getActivity强转get的方式,而是采用EventBus3.0
出现的问题:
当前的B Activity获取到上个A Activity传过来的值,B Activity加载了三个Fragment a b c,Fragment中注册EventBus监听:
![](https://img.haomeiwen.com/i3827753/357e160702bc628e.png)
Activity中通过post发送消息:
![](https://img.haomeiwen.com/i3827753/9127c965e5439a0f.png)
这样运行程序却发现一个问题,我的Fragment始终接收不到消息通知:
```
No subscribers registered for event class com.test.event.QaResultEvent
```
后来在网上查资料很久后才找到原因:
当前的Fragment属于B Activity,由于Activity post消息的时机是在ViewPager add Fragment之前的,相当于在Fragment的onCreat方法之前,Activity就已经把消息发送出去了,等到Fragment在onCreat中执行register后,无法收到这条消息,这个Event就提示没有注册者监听者!
eventbus 原理: 先注册接收事件,才能接收别人发送的 postevent。
但是没关系,eventbus3.0新版本的粘性事件poststicky就可以解决这个问题:
poststicky 可以使事件消费者在事件发布之后注册的也能接收到该事件
所以正确的方式应该是这样:
![](https://img.haomeiwen.com/i3827753/cf755b3062372968.png)
然后在Fragment的onEvent方法中也应该这样:
![](https://img.haomeiwen.com/i3827753/37b7ccdd1e756653.png)
这样,就能正确接收到消息了
最后:
还有一个要注意的就是,onEvent方式必须要使用public修饰符,不能使用private,否则你的程序会报错如下:
```
org.greenrobot.eventbus.EventBusException: Subscriber class com.xxx..xxxFragmnet and its super classes have no public methods with the @Subscribe annotation
```
当然,不要忘记了注册和解除注册
![](https://img.haomeiwen.com/i3827753/adce20ba0e1e8cc3.png)
![](https://img.haomeiwen.com/i3827753/56a279018901a243.png)
以上就是我开发中遇到的小小问题!希望对大家有帮助!!!