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

问题描述 投票:5回答:2

我有一个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返回后,不会触发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
android android-fragments notifydatasetchanged greenrobot-eventbus fragment-lifecycle
2个回答
2
投票

您可以看到更换片段时调用onStop(),因此EventBus未注册:

通过替换它来离开此片段时的生命周期事件:

onPause
onStop
onDestroyView
onDestroyOptionsMenu

然后,当你回到片段时,你的onResume()被调用然后EventBus被注册:

返回此片段时的生命周期事件:

onCreateView
onViewCreated
onViewCreated
onStart
onResume
onCreateOptionsMenu
onPrepareOptionsMenu

但是当你从ProductDetailFragment返回时,你的片段onResume()还没有被调用。因此,不调用片段中的subscribe方法。


1
投票

如果您使用发布事件的调试器逐步执行代码,从EventBus.post()postSingleEvent()postSingleEventForEventType()subscriptions的价值是多少?如果变量为null或为null且方法返回false,则订阅有问题。如果不是,或者您在事件发布后从未到达此代码,则问题将出现在代码中的其他位置。

我还建议在匹配的生命周期对中注册和取消注册事件订阅,可以在onStart()中注册,也可以在onStop()onResume() / onPause()中注销。

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

© www.soinside.com 2019 - 2024. All rights reserved.