事件总线混乱

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 和一些参数,当你必须管理某些情况时。