未收到 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());
您的 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) {
//...
}
我正在使用 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());
您的 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) {
//...
}