【问题标题】:Event Bus in Fragment片段中的事件总线
【发布时间】:2017-03-10 07:37:10
【问题描述】:

我创建了一个带有 2 个片段(FragmentOne.javaFragmentTwo.java)的 Activity (DemoActivity.java)。

我在像这样EventBus.getDefault().register(this);的Activity中注册了EventBus

并在Activity中创建了一个Suscriber方法:

@Subscriber
public void abc(String str) {
    Log.i(TAG,"MainActivity Called !!");
}

然后我在按钮单击EventBus.getDefault().post(""); 时从 FragmentTwo.java 发布一个事件

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

【问题讨论】:

  • 您需要像在活动中注册一样在 EventBus 中注册 FragmentOne
  • 您是否将您的片段注册为事件接收者?
  • @avi 我已经尝试过 - EventBus.getDefault().register(getActivity());
  • 为什么要获取 Activity 你需要传递你定义订阅者方法的片段的引用。在此处附上您的代码以便更好地参考。
  • 是的,弗拉德·马特维恩科。我为此使用了@Subscriber 注释.. 对吗?还是会有另一种解决方法?

标签: android greenrobot-eventbus-3.0


【解决方案1】:

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

  1. 您可能没有像注册DemoActivity 课程那样在FragmentOne 课程中注册EventBus
  2. 如果您在FragmentOne 类中注册了EventBus,请检查FragmentOne 片段类是否处于活动状态并且在从FragmentTwo 类发布事件时处于接收事件的状态。

编辑

从 cmets 可以看出,您已将 EventBus 注册为 EventBus.getDefault().register(getActivity()),因此只有您的 Activity 才会被注册。要注册您的 Fragment,请在您的 Fragment.onCreate() 方法中使用 EventBus.getDefault().register(this)

【讨论】:

  • 是的,刚刚做到了.. 但是我什么时候取消注册那个片段事件总线?
  • onDestroy()Fragment的方法
【解决方案2】:

使用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 
    }

}

【讨论】:

    【解决方案3】:

    您必须在 Fragment 中的 OnStart() 处注册 EventBus。

      override fun onStart() {
        super.onStart()
        EventBus.getDefault().register(this)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-10
      • 2021-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多