片段中的事件总线

时间:2017-03-10 07:37:10

标签: android greenrobot-eventbus-3.0

我创建了一个包含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("");

从FragmentTwo.java发布一个事件

这种情况对我来说很好。但是当我在FragmentOne.java中创建相同的订阅者方法时,它无法正常工作。为什么呢?

2 个答案:

答案 0 :(得分:9)

根据您的问题,可能有两件事导致了这个问题:

  1. 您可能没有像EventBus课程那样在FragmentOne课程中注册DemoActivity
  2. 如果您已在EventBus课程中注册了FragmentOne,那么请检查FragmentOne片段类是否处于活动状态并处于状态,以便在从{{1}发布事件时接收事件} class。
  3. 修改

    从评论中可以看出,您已将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 
    }

}