我有一个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
返回后,事件总线订阅者未触发,并且属于我的列表视图适配器的某些事件(例如notifyDataSetChanged
)没有响应,并且未反映UI上的更改。
从ProductDetailFragment
返回后,当控制权到达SearchFragment.onResume
时,调试代码行仍在注册,并且不需要再次注册,但生成的事件不会触发订阅者。
以防万一,这里是我的片段触发的生命周期事件:
关于创建片段的生命周期事件:
onAttach
onCreate
onCreateView
onViewCreated
onViewCreated
onStart
onResume
onCreateOptionsMenu
onPrepareOptionsMenu
通过替换该片段离开该片段时的生命周期事件:
onPause
onStop
onDestroyView
onDestroyOptionsMenu
返回此片段时的生命周期事件:
onCreateView
onViewCreated
onViewCreated
onStart
onResume
onCreateOptionsMenu
onPrepareOptionsMenu
答案 0 :(得分:2)
您可以看到,当替换片段时您onStop()
被调用,因此EventBus未注册:
通过替换该片段离开该片段时的生命周期事件:
onPause onStop onDestroyView onDestroyOptionsMenu
然后,当您返回到片段时,将调用onResume()
,然后将EventBus注册:
返回此片段时的生命周期事件:
onCreateView onViewCreated onViewCreated onStart onResume onCreateOptionsMenu onPrepareOptionsMenu
但是,当您从ProductDetailFragment返回时,尚未调用片段onResume()
。因此,片段中的subscription方法不会被调用。
答案 1 :(得分:1)
如果您使用发布事件的调试器逐步执行代码,从EventBus.post()
到postSingleEvent()
到postSingleEventForEventType()
,subscriptions
的价值是什么?如果变量为null或为空,并且该方法返回false,则预订有问题。如果不是这样,或者发布事件后您再也找不到此代码,那么问题可能出在代码的其他地方。
我还建议在匹配的生命周期对中注册和注销事件订阅,要么在onStart()
中注册,要么在onStop()
或onResume()
/ onPause()
中注销。
如果您共享更多代码以查看可能还有其他问题的地方,将会很有帮助。