在调用分离后保存片段 UI 状态



我正在使用操作栏中的选项卡使用UI。 在选项卡之间切换时,我目前正在管理我的活动中的选项卡单击事件,并根据需要使用 FragmentManager 调用附加和分离。

每次附加片段时,我都会经历整个生命周期并创建一个新视图并重新加载所有数据。 我正在使用onSaveInstanceState和onActivityCreated中的给定捆绑包来更新gui元素(主要是列表的滚动位置)。

这工作正常,但有很多开销。 就我而言,该列表可能有 300 条左右的记录,并且在选项卡之间切换时有明显的延迟。

为了加快速度,我现在将 onCreateView 中的根视图保存为类变量。 然后,当由于附加片段而再次调用onCreateView时,我测试根视图的非空值并返回它,而不是重新膨胀视图。 这个保存的视图仍然具有适当的数据集,在这种情况下,我也绕过了加载数据。 当然,如果片段在后台作系统销毁,我仍然需要完全重建视图和数据。

我的问题是这是否是一种有效的方法? 除非有内存问题需要担心,否则我认为它没有缺点。

这不是最好的方法,原因如下:

当您创建第一个根视图时,所有视图都使用 Activity 的上下文膨胀。如果此Activity被销毁,然后您尝试将Fragment重新附加到此Activity的新实例,则会遇到问题。

其次,在不使用时,让一个完全膨胀的根视图坐在那里是一种可怕的内存使用。现在,您提到的记录不会存储在任何View中,而是您的列表视图具有对您创建的适配器的引用,该适配器将适配器与您的视图一起保存在内存中。这是很多数据,只是坐在那里。

现在,为了正确为您提供建议,您最终必须在内存使用和性能之间划清界限,请记住,如果您打算公开此应用程序,则有很多劣质硬件设备。

一种选择是你已经完成的操作,即在分离时使用savedInstanceState变量。您可以尝试将 300 条记录放入此Bundle,看看效果如何。如果数据是您创建的类,请实现 Parcelable 接口(请参阅文档以了解如何正确实现这一点)并将其存储在 Bundle 中,然后稍后检索它并创建新的适配器。我强烈建议不要在附件之间保留对View的引用。

最新更新