Search code examples
javaandroidandroid-fragmentsevent-bus

EventBus communication between two Fragments. No subscriber error


I used EventBus for communication between Activity and Fragment without problems, however when I tired to do the same with two Fragments, EventBus notifies me that there has been no subscriber for given event. Here is a sample example of sending event from FragmentB to subscribed FragmentA:

Sample FragmentA(Receiver, which doesn't receive a message):

public class FragmentA extends Fragment {

private View mView;

@Subscribe(threadMode = ThreadMode.MAIN)  
public void onMessageEvent(int msg) {/* Do something */};

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    mView = inflater.inflate(R.layout.a_fragment_layout, container, false);
    EventBus.getDefault().register(this);
    return mView;
}

@Override
public void onStop() {
    super.onStop();
    EventBus.getDefault().unregister(this);
}
}

Sample FragmentB(Sender):

public class FragmentB extends Fragment {

private View mView;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    mView = inflater.inflate(R.layout.b_fragment_layout, container, false);
    sendMessage(1);
    return mView;
}

private void sendMessage(int msg){
    EventBus.getDefault().post(msg);
}
}

Error which I get:

No subscribers registered for event class org.greenrobot.eventbus.NoSubscriberEvent

The problem seems to be quite simple, however I can't figure it out.


Solution

  • Well, create a simple model class, let's call it NotifyEvent

    public class NotifyEvent {
        public int mValue;
    
        public NotifyEvent(int value){
            this.mValue = value;
        }
    }
    

    and now sending and receiving should be like

    in FragmentB:

    private void sendMessage(int msg){
        EventBus.getDefault().post(new NotifyEvent(msg));
    }
    

    in FragmentA:

    @Subscribe(threadMode = ThreadMode.MAIN)  
    public void onMessageEvent(NotifyEvent event){
            int msg = event.mValue;
            // do something with msg.
    }
    

    for details please go here