【问题标题】:Beste practices with SetRetainInstanceState?SetRetainInstance State 的最佳实践?
【发布时间】:2013-11-11 15:11:36
【问题描述】:

我目前在片段生命周期管理方面遇到问题。 如果重新创建片段所在的活动,我已设置 SetRetainInstanceState(true) 以保持片段实例处于活动状态。

但是,这导致我的观点出现一些奇怪的行为。有时我会收到有关活动上下文的一些片段视图和空指针异常的内存泄漏警告。

想要确保正确保留片段实例:关于保留片段(保留什么,销毁什么)的最佳实践是什么?

【问题讨论】:

    标签: android memory-management android-fragments


    【解决方案1】:

    SetRetainInstanceState(true) 确保 Android 在重新创建 Activity 时保留片段。因此,在重新创建活动后,片段最初附加到的活动不再存在,并且片段被附加到新的活动实例。

    为确保一切顺利,请记住以下几点:

    除非绝对必要,否则不要在片段中保留对附加活动的引用。改用getActivity() 方法,它将始终返回当前附加的片段(如果没有附加任何片段,则返回 null)。

    如果您绝对必须对当前附加的活动(您可能希望重新考虑您的设计)有一个“永久引用”,请确保在 onAttach 和 onDetach 方法中更新此引用。

    确保不保留使用 Activity 作为上下文初始化的对象(通常是视图、适配器等)。为此,请覆盖在活动重新创建之前调用的 Fragments onDestroyView() 方法。在这里,您可以处理片段仍然具有活动引用的视图和适配器(通常只需将它们的引用设置为 null 就足够了)。然后,您可以使用 onCreateView 调用中的新上下文重新创建片段的视图和适配器。

    【讨论】:

    • 谢谢!还有一个问题,如果我保留对有关视图的信息的引用(例如用于确定列表视图滚动位置的整数或浮点数),是否可以?
    • 任何未引用应用程序上下文之外的上下文或活动的对象都可以安全地保留。这包括表示视图状态的整数或对象。
    猜你喜欢
    • 2021-06-24
    • 1970-01-01
    • 2021-12-08
    • 2014-10-08
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多