Как использовать greenrobot для передачи данных в действие или фрагмент, который еще не был инициализирован?

Я попытался использовать данные переноса greenrobot между действиями и фрагментом, но я не смог найти подходящий учебник, который показывает, как это сделать подробно. Основываясь на том, что я прочитал до сих пор, я написал кое-что вроде этого, но он не работает. Как я могу использовать зеленый робот для передачи данных в действие или фрагмент, который еще не был инициализирован?

MainActivity:

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

Обработчик событий никогда не вызывается здесь. Что я делаю неправильно?

Ответ 1

EventBus имеет два метода для публикации и регистрации событий. В случаях, когда активность или фрагмент еще не инициализированы, мы можем использовать registerSticky и postSticky вместо регистрации и публикации.

вот мой собственный исправленный код:

MainActivity:

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

Ответ 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);
}

Ответ 3

Ответ Armin (первый ответ проверен как принятый).

Но если вы используете EventBus 3.0.0 (это последняя версия на данный момент) или выше, вы не можете использовать это:

EventBus.getDefault().registerSticky(this);

Это потому, что метод registerSticky устарел и удален, вы можете просто использовать метод register следующим образом:

EventBus.getDefault().register(this);

Надеюсь, это поможет разработчикам использовать современные библиотеки и технологии. Ура!

Ответ 4

Чтобы добавить ответы Армина и Дэвида, я сделал postSticky работу только после написания аннотации подзаголовка следующим образом:

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

как указано в документах EventBus для Важные события