未收到 Greenrobot EventBus 事件

Greenrobot EventBus event not received

我正在使用 Greenrobot EventBus 将事件从一个 activity 传递到另一个。

流程是这样的: Activity1 开始 -> 扫描条形码 -> Activity2 开始 -> 接受或拒绝响应并将事件发送到 Activity1。

因此 Activity2 通过执行以下操作向 Activity1 发送一个新事件:

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

在 Activity1 中,我注册了事件总线,而且我还有 public onEvent(MyEvent myEvent) 方法来接收事件。

问题是没有触发onEvent。我查看了事件总线对象是否存在问题(例如 Activity 1 和 2 中的不同实例或某些内容),但它是同一个实例。

我不知道问题出在哪里。如果有人可以看一下并告诉我我做错了什么,我将不胜感激。

谢谢!

在这种情况下,您可能需要使用粘性事件。 Activity1 启动 Activity2 后进入后台,不再接收任何事件。

将其放入您的 Activity1 而不是 EventBus.getDefault().register(Object Event)

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

并替换

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

在 Activity2 中

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

Here is a link to the documentation explaining it

您的 Activity1 EventBus 注销是什么样子的?

我遇到了同样的问题,因为我正在这样做:

Activity1.java

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

问题在于,当您启动 Activity2 时,onStop 会收到调用,因此会删除对该事件的订阅。我能够通过将注销移动到 onDestroy 来解决这个问题:

Activity1.java

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

class 测试

public class TestEventBus {

private String label;

public String getLabel() {
    return label;
}

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

Activity一个

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);

 }

在新版本中接收粘性事件设置 sticky 标志 true:

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