Я использую шину событий Otto для подписки на определенные события в ListFragment. Экземпляр шины хранится и создается в подклассе приложения, другими словами, он должен работать как одиночный. Кажется, это не случай...
Фрагмент регистрируется на шине в onActivityCreated(Bundle)
и не регистрируется в onDestroy()
. Это не работает должным образом. Я получил несколько отчетов о сбоях от устройств, где приложение вылетает при вызове unregister()
(java.lang.IllegalArgumentException: Отсутствует обработчик событий для аннотированного метода...). Это исключение вызывается только в том случае, если unregister()
вызывается перед любым вызовом register(), или если unregister()
вызывается дважды. Это может произойти только в том случае, если...
-
onActivityCreated(Bundle)
не вызывается доonDestroy()
. -
onDestroy()
вызывается дважды. - Экземпляр
Application
воссоздается между вызовомonActivityCreated(Bundle)
иonDestroy()
.
Мой класс приложения:
public class App extends Application {
private static App sInstance;
private Bus bus;
public static App getInstance() {
return sInstance;
}
@Override
public void onCreate() {
super.onCreate();
sInstance = this;
bus = new Bus(ThreadEnforcer.ANY);
}
public Bus getEventBus() {
return bus;
}
}
Класс фрагмента:
public class MyFragment extends ListFragment {
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
App.getInstance().getEventBus().register(this);
}
@Subscribe
public void onEvent(MyEvent event) {
....
}
@Override
public void onDestroy() {
App.getInstance().getEventBus().unregister(this);
super.onDestroy();
}
}
UPDATE:
Я оставил важную деталь; фрагменты использовались в ViewPager
. Они создаются по требованию, когда пользователи перемещаются между страницами в ViewPager
. Эта незначительная деталь кажется изменением жизненного цикла фрагментов на некоторых устройствах: onActivityCreated()
никогда не вызывается для фрагментов, инициированных после создания ViewPager
.