调用detach后保存片段UI状态

时间:2012-04-15 06:20:43

标签: android user-interface fragment lifecycle

我正在使用ActionBar中的标签处理UI。在标签之间切换时,我正在管理我的Activity中的Tab单击事件,并使用FragmentManager根据需要调用attach和detach。

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

您已经完成了一个选项,即在分离时使用savedInstanceState变量。您可以尝试将300条记录添加到此Bundle中,并查看其执行情况。如果数据是您创建的类,请实现Parcelable接口(请参阅documentation以了解如何正确实现此接口)并将其存储在Bundle中,然后在以后检索它创建一个新的适配器。我强烈建议不要在附件之间保留对View的引用。