【问题标题】:Saving fragment UI state after detach called调用分离后保存片段 UI 状态
【发布时间】:2012-04-15 06:20:42
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: android user-interface fragment lifecycle


    【解决方案1】:

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

    当您首先创建根视图时,所有视图都使用Activity 的上下文进行扩展。如果此 Activity 被销毁,然后您尝试将 Fragment 重新附加到此 Activity 的新实例,您将遇到问题。

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

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

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

    【讨论】:

    • 感谢您的回复。我看到其他人建议隐藏一个片段而不是调用分离,但会假设这会产生与我的解决方案相同的内存开销。
    • 我需要最终确定它们实际片段的外观。完成所有样式后,我将查看视图使用的内存并据此做出决定。对于给定的 API 级别,是否有任何可接受的内存使用指南?
    • 这将取决于设备硬件,而不是设备操作系统版本。如果您以前没有阅读过this 文章,请阅读。
    • 在这里接受建议,我正在采取优化内存而不是响应能力的路线。在我目前的测试中,使用典型数据集重新创建视图是可以接受的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多