【问题标题】:FragmentTransaction, Frame Container, Freeing Fragments and Memory ManagementFragmentTransaction、Frame Container、释放Fragment和内存管理
【发布时间】:2016-04-21 12:49:25
【问题描述】:

我有一个框架布局,用于交换片段。我使用导航抽屉,每个菜单项都会打开一个片段。所以可以肯定的是,在所有应用程序周期中,屏幕上同时只有 1 个片段(因此只有 1 个活动)。下面你可以找到我的片段启动方法

 public void startFragment(Fragment f)
{
    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
    transaction.replace(R.id.fragment_container, f);
    transaction.commit();


}

所以当我检查 Android Studio 时,每次我用上述方法替换片段时,内存使用量都会增加FragmentTransaction.remove 不释放片段,replace 也不释放。所以一段时间后,如果我单击每个菜单项并一遍又一遍地打开片段,内存使用量会增加很多。

所以我的问题是如何释放旧替换的片段?我只想要一个在内存中。或者我们可以说;我想摧毁他们

【问题讨论】:

  • "fragment 本身被销毁和 gc'ed 并不意味着您分配的所有资源也被删除" (1) - "发生这种情况是因为具有 UI 的 Fragment 将包含对UI 组件 [视图],这些视图包含 Activity 上下文的引用”(2) - “[Activity: 一个新的上下文和旧的用于垃圾收集的上下文] 它现在不能被垃圾收集,因为你的Fragment 还是对旧的有参考。” (3)
  • @Fllo 感谢您的解释。所以我会将每个上下文引用的变量分配给每个片段中的 null ondestroyview
  • @Fllo 所以我将每个 ui 元素分配给 null ,它似乎没有太大变化。我改变的是,创建了一个名为 mainView 的变量并在 onCreateView inflater.inflate 中分配。然后在 onDestroyView 中将这个变量赋值为 null 好像有点区别。我做错了什么?

标签: android android-fragments memory-management


【解决方案1】:

在您的活动终止之前,对其片段的所有引用都会 存在于记忆中。无论在 片段管理器级别/回栈。

查看thisMartín Marconcini 的堆栈溢出答案。

如果碎片存在于后堆栈中,则可以隐藏和显示碎片。 看看this

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    相关资源
    最近更新 更多