我正在使用 Otto 事件总线订阅 ListFragment 中的某些事件。总线实例存储和创建在 Application 的子类中,换句话说,它总线应该作为单例工作。好像不是这样的……
该片段在 中注册到总线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();
}
}
更新:
我遗漏了一个重要的细节;片段用于 a ViewPager
。当用户在ViewPager
. 这个小细节似乎改变了某些设备上的片段生命周期:在创建 onActivityCreated()
之后启动的片段永远不会被调用。ViewPager