10

我尝试在活动和片段之间使用 greenrobot 传递数据,但我找不到合适的教程来详细说明如何做到这一点。根据我到目前为止所读到的内容,我写了一些类似的东西,但它不起作用。如何使用绿色机器人将数据传递给尚未初始化的活动或片段?

主要活动 :

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    EventBus.getDefault().post(new String("We are the champions"));
    Intent intent = new Intent("com.test.Activity_Lessons");
    startActivity(intent);
}

Activity_Lessons:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //Some initializations
    EventBus.getDefault().register(this);
    //Other Stuff
}

public void onEventMainThread(String s){
    Toast.makeText(getActivity(), s, Toast.LENGTH_LONG).show();
}

这里永远不会调用事件处理程序。我做错了什么?

4

4 回答 4

17

EventBus 有两种方法用于发布和注册事件。如果活动或片段尚未初始化,我们可以使用 registerSticky 和 ​​postSticky 来代替注册和发布。

这是我自己更正的代码:

主要活动 :

@Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    EventBus.getDefault().postSticky(new String("We are the champions"));
    Intent intent = new Intent("com.test.Activity_Lessons");
    startActivity(intent);
}

Activity_Lessons:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //Some initializations
    EventBus.getDefault().registerSticky(this);
    //Other Stuff
}

public void onEventMainThread(String s){
    Toast.makeText(getActivity(), s, Toast.LENGTH_LONG).show();
}
于 2014-01-28T11:21:46.720 回答
2

我想你忘了注册你的活动。

尝试添加以下内容: MainActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  EventBus.getDefault().post(new String("We are the champions"));
  EventBus.getDefault().register(this);
  Intent intent = new Intent("com.test.Activity_Lessons");
  startActivity(intent);
}

@Override
public void onDestroy() {
    super.onDestroy();
    EventBus.getDefault().unregister(this);
}
于 2014-01-27T15:09:06.290 回答
2

为了添加到 Armin 和 David 的答案,我postSticky只有在像这样编写订阅者的注释后才开始工作:

@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)

如粘滞事件的 EventBus 文档中所述

于 2016-12-02T00:27:24.893 回答
1

Armin 的答案(第一个答案被检查为已接受)是正确的。

但是如果你使用的是 EventBus 3.0.0(目前是最新版本)或更高版本,你不能使用这个:

EventBus.getDefault().registerSticky(this);

那是因为 registerSticky 方法已被弃用和删除,你可以像这样使用 register 方法:

EventBus.getDefault().register(this);

希望这将有助于开发人员使用最新的库和技术。干杯!

于 2016-07-14T19:51:19.853 回答