我有一个SearchFragment
类扩展了一个名为BaseFragment
的类,其中onResume
和onStop
被覆盖如下:
@Override
public void onResume() {
checkEventBusRegistration();
super.onResume();
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
public void checkEventBusRegistration()
{
if(!EventBus.getDefault().isRegistered(this))
{
EventBus.getDefault().register(this);
}
}
SearchFragment
是一个显示搜索结果列表的片段。通过点击每个项目,产品的详细信息将通过以下调用显示在其他片段上:
getFragmentManager().beginTransaction().replace(R.id.container, new ProductDetailFragment()).addToBackStack(null).commit();
此外,我片段中的其他一些事件也不能很好地运行。我的片段有一个listView,它不响应notifyDataSetChanged()
。
从ProductDetailFragment
返回后,不会触发eventbus订阅者,并且属于我的listview的适配器的某些事件(如notifyDataSetChanged
)不会响应并反映UI上的更改。
从ProductDetailFragment
返回后调试代码行,当控制到达SearchFragment.onResume
eventbus时仍然注册,并且它不需要再次注册,但生成的事件不会触发订阅者。
如果它有帮助,这里有我的片段触发的生命周期事件:
创建片段的生命周期事件:
onAttach
onCreate
onCreateView
onViewCreated
onViewCreated
onStart
onResume
onCreateOptionsMenu
onPrepareOptionsMenu
通过替换它来离开此片段时的生命周期事件:
onPause
onStop
onDestroyView
onDestroyOptionsMenu
返回此片段时的生命周期事件:
onCreateView
onViewCreated
onViewCreated
onStart
onResume
onCreateOptionsMenu
onPrepareOptionsMenu
您可以看到更换片段时调用onStop()
,因此EventBus未注册:
通过替换它来离开此片段时的生命周期事件:
onPause onStop onDestroyView onDestroyOptionsMenu
然后,当你回到片段时,你的onResume()
被调用然后EventBus被注册:
返回此片段时的生命周期事件:
onCreateView onViewCreated onViewCreated onStart onResume onCreateOptionsMenu onPrepareOptionsMenu
但是当你从ProductDetailFragment返回时,你的片段onResume()
还没有被调用。因此,不调用片段中的subscribe方法。
如果您使用发布事件的调试器逐步执行代码,从EventBus.post()
到postSingleEvent()
到postSingleEventForEventType()
,subscriptions
的价值是多少?如果变量为null或为null且方法返回false,则订阅有问题。如果不是,或者您在事件发布后从未到达此代码,则问题将出现在代码中的其他位置。
我还建议在匹配的生命周期对中注册和取消注册事件订阅,可以在onStart()
中注册,也可以在onStop()
或onResume()
/ onPause()
中注销。
如果您共享更多代码以查看可能存在问题的其他地方,将会很有帮助。