我创建了一个包含2个片段的活动( DemoActivity.java )( FragmentOne.java 和 FragmentTwo.java )。
我在活动中注册EventBus
,如EventBus.getDefault().register(this);
并在Activity中创建了一个Suscriber方法:
@Subscriber
public void abc(String str) {
Log.i(TAG,"MainActivity Called !!");
}
然后我点击按钮EventBus.getDefault().post("");
这种情况对我来说很好。但是当我在FragmentOne.java中创建相同的订阅者方法时,它无法正常工作。为什么呢?
答案 0 :(得分:9)
根据您的问题,可能有两件事导致了这个问题:
EventBus
课程那样在FragmentOne
课程中注册DemoActivity
。EventBus
课程中注册了FragmentOne
,那么请检查FragmentOne
片段类是否处于活动状态并处于状态,以便在从{{1}发布事件时接收事件} class。修改
从评论中可以看出,您已将FragmentTwo
注册为EventBus
,因此只有您的活动才会注册。要在EventBus.getDefault().register(getActivity())
方法中注册Fragment
使用EventBus.getDefault().register(this)
。
答案 1 :(得分:3)
使用Sticky Events表示片段。因为碎片会在一段时间内加载多个偏移量。
注册并取消注册您的Eventbus:
@Override
public void onStart() {
Log.d(TAG, "Register ");
EventBus.getDefault().register(this);
super.onStart();
}
@Override
public void onStop() {
super.onStop();
Log.d(TAG, "Unregister");
EventBus.getDefault().unregister(this);
}
OnChildChange.class帖子事件
.postSticky()
:
EventBus.getDefault().postSticky(new OnChildChange(position));
使用
sticky = true
订阅EventBus:
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onCategoryChangeEvent(OnChildChange event){
// get the event and remove drom sticky
OnChildChange stickyEvent = EventBus.getDefault().removeStickyEvent(OnChildChange.class);
if(stickyEvent != null) {
// apply your logic or call methods
}
}