1

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

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

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

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

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

4

1 回答 1

1

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

当您首先创建根视图时,所有视图都使用Activity' 上下文进行膨胀。如果 thisActivity被破坏,然后您尝试将其重新附加Fragment到 this 的新实例Activity,您将遇到问题。

其次,当它不被使用时,有一个完全膨胀的根视图坐在那里是一种糟糕的内存使用。现在,您提到的记录没有存储在 anyView中,而是您的列表视图引用了您创建的适配器,该适配器与您的视图一起保存在内存中。只是坐在那里就有很多数据。

现在要正确地给你推荐,你最终必须在内存使用和性能之间划清界限,记住如果你打算公开这个应用程序,有很多劣质的硬件设备。

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

于 2012-04-15T07:13:18.287 回答