2016-06-09 49 views
0

在我的应用程序中,我使用backstack作为我的片段和popBackStack来备份以前的片段。破坏后内存堆中的片段不清楚

我有问题,当我回到由popBackStack前一个片段。 (FragmentA-> FragmentB-> FragmentA)。我看到在fragmentB中popBackStack到前一个fragmentA时,它被称为onDestroy方法。我在getFragmentManager().getFragments()找到FragmentB,但我可以找到它。

但是,当我转储内存堆,我发现堆x上的FragmentB(我打开片段B x次)。它增加了我的记忆堆,然后当我重复流A-> B-> A时,出现错误OutOFMemory,直到满堆。

我无法找到任何解决方案或导致我的问题。有什么建议可以解决我的问题吗?

+1

你应该检查是否有任何强烈的引用FragmentB没有被销毁时释放。如果可能的话,在这里分享你的代码片段,这样每个人都可以给你建议。 – Robo

+0

抱歉,我无法分享我的代码。我在这里创建了像我的流程应用程序这样的示例项目:https://github.com/sinhpn92/FragmentStackTest。 我的样品没有这个问题。但在我的项目中,我有上面的问题。我不知道为什么?这个问题有什么原因吗? –

回答

0

1>尝试在堆栈保持片段(添加和弹出而要添加新片段)

例如: 私人堆栈fragmentStack =新堆栈();

//代码在堆栈中添加新的片段,在前面的堆栈中添加前一个片段 FragmentTransaction ft = fragmentManager.beginTransaction();

Fragment mFragment = new Fragment(); // you can replace this with your fragment 
    ft.add(R.id.container, mFragment); // you can also add fragment id so that if you can reuse that fragment if it is memory. 
    fragmentStack.lastElement().onPause(); 
    ft.hide(fragmentStack.lastElement()); 
    fragmentStack.push(resultListFragment); 
    ft.commit(); 

//代码从顶部除去可见片段并恢复回栈片段

如果(fragmentStack.size()== 2)//用于检查是否其是任何片段在堆栈是肯定比onbackbutton事件返回事件{FragmentTransaction ft = fragmentManager.beginTransaction(); fragmentStack.lastElement()。onPause(); ft.remove(fragmentStack.pop()); fragmentStack.lastElement()。onResume(); ft.show(fragmentStack.lastElement()); ft.commit(); }

2>如果以上操作不解决您OutOfMemory错误比片段生命周期的onCreate(捆绑)系统回调方法使用setRetaininstance(真)的问题,所以如果他们已经在内存中它不会产生新的片段。