片段在恢复后不响应UI更新和事件总线事件

时间:2019-03-11 09:46:51

标签: android android-fragments notifydatasetchanged greenrobot-eventbus fragment-lifecycle

我有一个SearchFragment类,它扩展了一个名为BaseFragment的类,其中onResumeonStop的重写如下:

@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

2 个答案:

答案 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()中注销。

如果您共享更多代码以查看可能还有其他问题的地方,将会很有帮助。