GreenRobot Ошибка EventBus в фрагментах: подписчиков, зарегистрированных для класса событий

У меня есть активность, его макет содержит FrameLayout. Я использую framelayout как контейнер фрагмента. Я заменяю фрагменты в FrameLayout, используя транзакции FragmentManager.

В одном из методов onCreate этого фрагмента я регистрирую фрагмент с использованием EventBus.

@Override public void onCreate(){ EventBus.getDefault().register(this); // other initialization code } 

Фрагмент имеет GridView в своем расположении. Всякий раз, когда элемент в gridView кликается, я отправляю событие в EventBus

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){ View rootView = inflater.inflate(R.layout.fragment_category, container, false); gridView = (GridView) rootView.findViewById(R.id.categry_grid_view); gridAdapter = new CustomGridAdapter(getActivity()); gridView.setAdapter(gridAdapter); gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View v, int position, long id) { Category clickedCategory = gridAdapter.getItem(position); EventBus.getDefault().post(new MyEvent()); } }); 

Методы обработчика событий для этого события находятся в одном фрагменте, т. Е. Фрагмент имеет следующий метод

 public void onEvent(MyEvent e){ //some code; } 

Это отлично работает, пока приложение не потеряет фокус и становится неактивным (из-за нажатия кнопки «домой» или блокировки экрана). Когда я снова активирую приложение, обработчики событий для событий не вызывают. В LogCat можно увидеть следующие утверждения

 com.example.app D/Event﹕ No subscribers registered for event class com.example.app.MyEvent com.example.app D/Event﹕ No subscribers registered for event class de.greenrobot.event.NoSubscriberEvent 

Может кто-нибудь сказать мне, что я делаю неправильно здесь?

Изменить 1:

Когда приложение становится неактивным из-за блокировки экрана или нажатой кнопки дома, вызывается метод onStop фрагмента. Код для отмены регистрации фрагмента из EventBus находится в методе onStop. Когда приложение снова активируется, вызываются методы onStart и onResume фрагмента. Поэтому я переместил свой код, чтобы зарегистрировать фрагмент с EventBus в его методе onStart.

 @Override public void onStart(){ super.onStart(); EventBus.getDefault().register(this); } 

Я помещал некоторые операторы журнала, чтобы проверить, действительно ли метод onStart вызывается, когда приложение становится активным. Он называется. Все еще не работает, когда приложение становится неактивным, а затем снова активным.

Edit 2 Я забыл упомянуть, что активность, которая содержит этот фрагмент, также подписывается на EventBus. Код для регистрации активности с EventBus находится в методе onCreate, а код для отмены регистрации активности – в методе onStop.

Solutions Collecting From Web of "GreenRobot Ошибка EventBus в фрагментах: подписчиков, зарегистрированных для класса событий"

Деятельность, которая содержала этот фрагмент, также подписалась на EventBus. Код для регистрации активности с EventBus был в методе onCreate, а код для отмены регистрации был в методе onStop.

Когда приложение становилось неактивным (из-за блокировки экрана или нажатия кнопки «Главная»), вызываемый метод onStop объекта активности вызывался, и он получал unregisterd из EventBus. По какой-то причине его содержащие фрагменты также были незарегистрированы (я не уверен, почему). Повторная регистрация фрагментов с помощью EventBus не сработала.

Я решил эту проблему, переместив код, чтобы отменить регистрацию активности на метод onDestroy.

Я все еще не уверен, почему это работает, но по крайней мере, он решает мою текущую проблему. Если у кого-то есть объяснение или лучшее понимание, прокомментируйте или отправьте ответ.

Для меня проблема была чем-то другим, я попытался сделать запись в фрагмент, который еще не был зафиксирован. Вы получите те же 2 ошибки, что и в вопросе.

Поэтому я сделал getSupportFragmentManager().executePendingTransactions(); Перед тем как называть сообщение, и это устранило проблему для меня.