6

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

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

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

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

在 Activity1 中,我注册了事件总线,并且我还拥有用于接收事件的公共 onEvent(MyEvent myEvent) 方法。

问题是 onEvent 没有被触发。我查看了事件总线对象上可能存在问题(例如不同的实例或活动 1 和 2 中的某些东西),但它是同一个实例。

我不知道似乎是什么问题。如果有人可以看看并告诉我我做错了什么,我将不胜感激。

谢谢!

4

4 回答 4

12

在这种情况下,您可能需要使用粘性事件。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());

这是解释它的文档的链接

于 2015-03-03T23:48:39.383 回答
3

您的 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);
}
于 2017-03-27T01:05:13.373 回答
0

班级考试

public class TestEventBus {

private String label;

public String getLabel() {
    return label;
}

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

活动一

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

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

 }
于 2018-03-14T17:54:00.023 回答
0

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

@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
fun onNewEvent(event: MessageEvent) {
    //...
}
于 2020-10-10T22:00:32.693 回答