Alin
Alin

Reputation: 1044

Greenrobot EventBus event not received

I'm using Greenrobot EventBus to pass events from one activity to another.

The flow is something like this: Activity1 starts -> scan a barcode -> Activity2 starts -> accept or deny the response and send an event to Activity1.

So Activity2 sends a new event to Activity1 by doing something like:

@Override
public void onCreate(){
  EventBus.getDefault().register(this);
  // other initialization code
  EventBus.getDefault().post(new MyEvent());
}

In Activity1 I register the event bus and also I have the public onEvent(MyEvent myEvent) method for receiving the event.

The problem is that the onEvent is not triggered. I looked to see maybe there's a problem on the event bus object (like different instances or someting in Activity 1 and 2) but it;s the same instance.

I don't know what seems to be the problem. If somebody could take a look and tell me what am I doing wrong I would much appreciate it.

Thanks!

Upvotes: 7

Views: 10920

Answers (5)

Adam reuben
Adam reuben

Reputation: 55

That happens because, onStart() you register eventBus then you got to the next activity... so technically event bus is already register in the previous activity... so when you come back to the same activity event bus will crash the app because it already assumed you have registered already....

So Inorder to fix this try to call, on the activity to prevent it from crashing!

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

}

Upvotes: 0

Hossein
Hossein

Reputation: 867

In new versions to receive sticky events set sticky flag true:

@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
fun onNewEvent(event: MessageEvent) {
    //...
}

Upvotes: 0

Rudda Beltrao
Rudda Beltrao

Reputation: 37

class test

public class TestEventBus {

private String label;

public String getLabel() {
    return label;
}

public void setLabel(String label) {
    this.label = label;
}
}

Activity A

TestEventBus t = new TestEventBus();
t.setLabel("oi");
EventBus.getDefault().post( t );

Activity B

@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onMessageEvent(TestEventBus test) {

Toast.makeText(this, "label "+test.getLabel(), 
Toast.LENGTH_SHORT).show();

};

@Override
public void onStart() {
  super.onStart();
  EventBus.getDefault().register(this);
}

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

 }

Upvotes: 1

tdavis20050
tdavis20050

Reputation: 171

You probably need to use sticky events in this case. After Activity1 starts Activity2 it goes to the background, and can no longer receive any events.

Put this in your Activity1 instead of EventBus.getDefault().register(Object Event)

@Override
public void onStart() {
    super.onStart();
    EventBus.getDefault().registerSticky(this);
}

and replace

EventBus.getDefault().post(new MyEvent());

in Activity2 with

EventBus.getDefault().postSticky(new MyEvent());

Here is a link to the documentation explaining it

Upvotes: 12

StevenTsooo
StevenTsooo

Reputation: 508

How does your Activity1 EventBus unregister look like?

I had the same issue because of I was doing this:

Activity1.java

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

The problem with this is that when you start Activity2 onStop gets call, therefore removing the subscription to the event. I was able to solve that by moving the unregister to onDestroy so:

Activity1.java

@Override
protected void onDestroy() {
    super.onDestroy();
    EventBus.getDefault().unregister(this);
}

Upvotes: 3

Related Questions