【发布时间】:2019-03-11 09:46:50
【问题描述】:
我有一个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();
此外,我的片段中的一些其他事件无法正常工作。我的片段有一个不响应 notifyDataSetChanged() 的 listView。
从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
【问题讨论】:
-
在 ondestroy 中注销并检查一次
-
@ManoharReddy 它没有帮助。在第一次运行片段时一切都很好,但是在移动到下一个片段并返回后它开始失败......
-
你为什么在 onResume 方法中注册,在 onStop 方法中取消注册?使用配对的 onResume/onPause 不应该更容易吗?
-
@NicolaGallazzi 那么有什么区别呢?
-
@VSB 您不需要 checkEventBusRegistration(),onPause 会在 onResume 之后立即调用,您不会冒事件总线注册泄漏的风险。不知道这是否能解决你的问题,但我会试试看
标签: android android-fragments notifydatasetchanged greenrobot-eventbus fragment-lifecycle