Android:如何从片段管理器中删除片段

时间:2015-07-13 11:45:33

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

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

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

跟踪片段管理器上的片段数
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中删除所有这些片段,以减少app的内存使用量。

请帮我这个。 提前谢谢。

5 个答案:

答案 0 :(得分:0)

getFragmentManager().popBackStack();

之后尝试.commit()

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您可以在BackStack上获取片段数量     。getFragmentManager()getBackStackEntryCount();

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

答案 3 :(得分:0)

您可以在达到特定数量时删除所有片段。

// 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();
}

答案 4 :(得分:0)

我想,如果你浏览getFragments()返回的片段的ArrayList,你会看到,除了实际上活动的那个之外,它们都是 null 。所以这不是问题。

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