Reputation: 1044
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
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
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
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
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
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