【问题标题】:Android : How to remove fragments from fragment managerAndroid:如何从片段管理器中删除片段
【发布时间】:2015-10-01 16:00:19
【问题描述】:

我正在开发 Android 应用程序。 在单个活动中,我正在替换片段。 经过一些迭代后,我的应用程序在没有任何强制关闭消息的情况下关闭,也不例外。

在搜索时,我得到了一件事。 如果我使用

在片段管理器上跟踪片段数
getSupportFragmentManager().getFragments().size() 

当我正在替换片段时,只有一个片段处于活动状态并且后堆栈中没有片段存在,它会继续增加。

例子:

  • 片段 1 > 片段 2:片段数为 2
  • 片段 1 > 片段 2 > 片段 3:片段数为 3
  • 片段 1 > 片段 2 > 片段 3 > 片段 2 > 片段 1:片段数为 3

这是我用于片段事务的代码:

getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.content, fragmentStep1,
                    ApplicationTags.FRAGMENT_TAG_PAGE_1)
            .disallowAddToBackStack().commit();
    getFragmentManager().executePendingTransactions();

我需要从 fragentmanager 中删除所有这些片段,以减少应用程序的内存使用量。

请帮我解决这个问题。 提前致谢。

【问题讨论】:

标签: android android-fragments android-activity memory-leaks out-of-memory


【解决方案1】:

.commit()之后尝试getFragmentManager().popBackStack();

【讨论】:

  • 在提供基于代码的答案时最好包含解释...
  • @2Dee 在很多情况下,这是我的主要职位。完整的代码示例剥夺了提问者可能的想法。我认为我的答案是完整的。
【解决方案2】:

如果是内存问题,您的日志中会出现 OOM 错误。您发布的代码是正确的。问题一定是别的。

【讨论】:

    【解决方案3】:

    您可以通过以下方式获取 BackStack 上的片段数 getFragmentManager().getBackStackEntryCount();

    当您正在替换片段而不是将前一个片段保存在 BackStack 上时,一次只会有一个片段。所以问题不在于片段。

    【讨论】:

    • 那么,如果正好有 1 个片段,getFragmentManager().getBackStackEntryCount(); 应该是 0 吗?还是应该是 1?
    【解决方案4】:

    当碎片达到一定数量时,您可以删除所有碎片。

    // set your own max stack size
    MAX_STACK_SIZE = 20;
    
    int stackSize = getBackStackEntryCount;
    if(stackSize>20)
    FragmentManager fm = getSupportFragmentManager();
    for(int i = 0; i < stackSize; ++i) {
        fm.popBackStackImmediate();
    }
    

    【讨论】:

      【解决方案5】:

      我猜,如果您查看由getFragments() 返回的片段的 ArrayList,您会看到,除了实际上处于活动状态的片段之外,所有片段都是 null。所以这不是问题。

      (这就是我试图弄清楚为什么我的活动中似乎有比我预期更多的活跃片段时发生的事情)

      【讨论】:

        猜你喜欢
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-17
        相关资源
        最近更新 更多