Шина событий во фрагменте



Я создал одну активность ({5]} Демоактивность.java ) С 2 фрагментами (FragmentOne.java и FragmentTwo.java ).



Я зарегистрировал EventBus в деятельности, подобной этой EventBus.getDefault().register(this);



И создал один метод Suscriber в своей деятельности:



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


Затем я публикую событие из FragmentTwo.java on button click EventBus.getDefault().post("");



Этот сценарий прекрасно работает для меня. Но когда я создаю тот же метод подписчика в FragmentOne.java это не работает. Почему?

444   2  

2 ответов:

Из вашего вопроса могут быть две вещи, которые вызывают проблему:

  1. Возможно, вы не зарегистрировали EventBus в своем классе FragmentOne, Как вы это сделали для своего класса DemoActivity.
  2. Если вы зарегистрировали EventBus в классе FragmentOne, то, пожалуйста, проверьте, если FragmentOne класс фрагмента жив и находится в состоянии получить событие, отправляя событие из класса FragmentTwo.

Edit

Как видно из комментариев, Вы зарегистрировали свой EventBus как EventBus.getDefault().register(getActivity()) из-за этого регистрироваться будет только ваша деятельность. Для регистрации вашего Fragment Используйте EventBus.getDefault().register(this) в вашем методе Fragment.onCreate().

Используйте липкие события для фрагмента. Потому что фрагменты загружаются многократными смещениями некоторое время.

Регистрация и отмена регистрации шины событий:

 @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.событие класса post с .postSticky():

EventBus.getDefault().postSticky(new OnChildChange(position));

Подписаться на EventBus с помощью sticky = true:

@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 
    }

}

Comments

    Ничего не найдено.