Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 事件总线混乱_Java_Android_Greenrobot Eventbus - Fatal编程技术网

Java 事件总线混乱

Java 事件总线混乱,java,android,greenrobot-eventbus,Java,Android,Greenrobot Eventbus,我正在尝试将对象列表从ActivityTwo发送到MainActivity 我遵循了EventBus,从onStart和onStop调用了register()和unregister()方法,然后使用EventBus.getDefault().post()发送数据 在MainActivity上,除非从onStop()中删除unregister()调用,否则我不会得到任何东西 我的问题是,我是否正确使用了它?我应该在ondestory()中调用unregister()?如果是这样的话,如果活动停止时

我正在尝试将对象列表从
ActivityTwo
发送到
MainActivity

我遵循了EventBus,从onStart和onStop调用了
register()
unregister()
方法,然后使用
EventBus.getDefault().post()
发送数据

MainActivity
上,除非从
onStop()
中删除
unregister()
调用,否则我不会得到任何东西

我的问题是,我是否正确使用了它?我应该在
ondestory()
中调用
unregister()
?如果是这样的话,如果活动停止时它不会接收任何信息,为什么他们要从
onStop
调用它

main活动

@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();
}
活动二

private void sendYoutubeData() {
        if(youtubeData != null){

          EventBus.getDefault().post(youtubeData);
          finish();
      }

 }

如果要在MainActivity中接收不可见的事件,则可以将
register()
unregister()
分别放在
onCreate()
onestroy()


如果您的事件没有侦听器,它将永远不会被接收,除非它是一个粘性事件,在这种情况下,您可以在注册时接收它。有关粘性事件的更多信息问题在于,必须使用事件总线的post行发布列表,然后必须在类中重写OneEvent()。 是一个有帮助的链接

您需要做的是定义其他事件,如

public static class MessageEvent { /* Additional fields if needed */ }
现在,从获取数据的部分开始,将其发布到事件中

EventBus.getDefault().post(new MessageEvent());
在活动内部放置一个订户函数,当数据发布到事件总线时将触发该函数。 在那里你可以使用发布的数据

public void onMessageEvent(MessageEvent event) {/* Use the data*/};

您将不会获得任何事件,因为您处于活动2中,这意味着您的第一个活动处于“已停止”状态。根据您想要实现的目标,您可以尝试
startActivityForResult
或创建一个粘性事件,但我不建议使用事件总线进行此类简单操作,因为它可能会导致难以调试的严重错误


因此,我建议您选择选项1,使用
startActivityForResult

如果您想在活动没有焦点的情况下接收活动事件,那么您可能做错了什么。我建议将subscriber内容移动到一个静态的singleton类,然后从该类开始活动,在您必须管理某些情况时,要有目的和一些参数。

这回答了问题,但不是这些简单任务的最佳用例。