前言:
最近使用项目中使用EventBus,其中有一个Activity中使用ViewPager加载三个Fragment,由于存在传值的需求,并没有采用直接getActivity强转get的方式,而是采用EventBus3.0
出现的问题:
当前的B Activity获取到上个A Activity传过来的值,B Activity加载了三个Fragment a b c,Fragment中注册EventBus监听:
注册监听Activity中通过post发送消息:
activity发送消息这样运行程序却发现一个问题,我的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 可以使事件消费者在事件发布之后注册的也能接收到该事件
所以正确的方式应该是这样:
Activity中发送消息然后在Fragment的onEvent方法中也应该这样:
fragment中的监听方法这样,就能正确接收到消息了
最后:
还有一个要注意的就是,onEvent方式必须要使用public修饰符,不能使用private,否则你的程序会报错如下:
```
org.greenrobot.eventbus.EventBusException: Subscriber class com.xxx..xxxFragmnet and its super classes have no public methods with the @Subscribe annotation
```
当然,不要忘记了注册和解除注册
注册监听 解除监听以上就是我开发中遇到的小小问题!希望对大家有帮助!!!
网友评论