事件总线混乱
EventBus confusion
我正在尝试将对象列表从 ActivityTwo
发送到 MainActivity
我按照EventBus的get started page从onStart和onStop调用了register()
和unregister()
方法,然后我使用EventBus.getDefault().post()
发送数据。
在 MainActivity
上,除非我从 onStop()
中删除 unregister()
调用,否则我什么也得不到。
我的问题是,我使用正确吗?我应该在 onDestroy()
中调用 unregister()
吗?如果是这样,他们为什么要从 onStop
调用它,如果 activity 停止时它不会接收任何东西
MainActivity
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(YoutubeData event) {
System.out.print(event);
}
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
ActivityTwo
private void sendYoutubeData() {
if(youtubeData != null){
EventBus.getDefault().post(youtubeData);
finish();
}
}
如果您想在MainActivity 不可见时接收事件,是的,您应该将register()
和unregister()
分别放在onCreate()
和onDestroy()
中。
如果您的活动没有听众,则永远不会收到它,除非它是粘性事件,在这种情况下,您可以在注册时收到它。有关粘性事件的更多信息 here
问题是您必须 post 带有事件总线 post 行的列表,然后您必须覆盖 class 中的 onEvent()。
here 是一个 link,这会有所帮助。
您需要做的是定义其他事件,例如
public static class MessageEvent { /* Additional fields if needed */ }
现在从您获取数据的部分 post 到事件。
EventBus.getDefault().post(new MessageEvent());
在你的内部 activity 你放置了一个订阅者功能,当数据被 post 发送到事件总线时,该功能将被触发。
然后你使用 posted 数据
public void onMessageEvent(MessageEvent event) {/* Use the data*/};
您将不会收到任何事件,因为您处于 activity 两个状态,这意味着您的第一个 activity 处于 "stopped" 状态。根据您想要实现的目标,您可以尝试 startActivityForResult
或创建一个粘性事件,但我不建议使用事件总线进行这样的简单操作,因为它会导致难以调试的错误。
所以我建议您使用选项 1,使用 startActivityForResult
。
如果您想在 activity 没有焦点时在 Activity 上接收事件,那么您可能做错了什么。我建议将订阅者的东西移动到静态单例 class 并从那个 class 开始 Activity 带有 Intent 和一些参数,当你必须管理某些情况时。
我正在尝试将对象列表从 ActivityTwo
发送到 MainActivity
我按照EventBus的get started page从onStart和onStop调用了register()
和unregister()
方法,然后我使用EventBus.getDefault().post()
发送数据。
在 MainActivity
上,除非我从 onStop()
中删除 unregister()
调用,否则我什么也得不到。
我的问题是,我使用正确吗?我应该在 onDestroy()
中调用 unregister()
吗?如果是这样,他们为什么要从 onStop
调用它,如果 activity 停止时它不会接收任何东西
MainActivity
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(YoutubeData event) {
System.out.print(event);
}
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
ActivityTwo
private void sendYoutubeData() {
if(youtubeData != null){
EventBus.getDefault().post(youtubeData);
finish();
}
}
如果您想在MainActivity 不可见时接收事件,是的,您应该将register()
和unregister()
分别放在onCreate()
和onDestroy()
中。
如果您的活动没有听众,则永远不会收到它,除非它是粘性事件,在这种情况下,您可以在注册时收到它。有关粘性事件的更多信息 here
问题是您必须 post 带有事件总线 post 行的列表,然后您必须覆盖 class 中的 onEvent()。 here 是一个 link,这会有所帮助。
您需要做的是定义其他事件,例如
public static class MessageEvent { /* Additional fields if needed */ }
现在从您获取数据的部分 post 到事件。
EventBus.getDefault().post(new MessageEvent());
在你的内部 activity 你放置了一个订阅者功能,当数据被 post 发送到事件总线时,该功能将被触发。 然后你使用 posted 数据
public void onMessageEvent(MessageEvent event) {/* Use the data*/};
您将不会收到任何事件,因为您处于 activity 两个状态,这意味着您的第一个 activity 处于 "stopped" 状态。根据您想要实现的目标,您可以尝试 startActivityForResult
或创建一个粘性事件,但我不建议使用事件总线进行这样的简单操作,因为它会导致难以调试的错误。
所以我建议您使用选项 1,使用 startActivityForResult
。
如果您想在 activity 没有焦点时在 Activity 上接收事件,那么您可能做错了什么。我建议将订阅者的东西移动到静态单例 class 并从那个 class 开始 Activity 带有 Intent 和一些参数,当你必须管理某些情况时。