2016-01-15 46 views
3

我有一个框架布局,我用它来交换片段。我使用导航抽屉,每个菜单项打开一个片段。所以可以肯定的是,在所有应用程序周期中,屏幕上将会同时出现只有1个片段(因此有1个活动)。下面你可以找到我的片段启动方法FragmentTransaction,框架容器,释放片段和内存管理

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也不释放。所以过了一会儿,如果我点击每个菜单项并一次又一次打开碎片,内存使用量会增加很多。

所以我的问题是如何释放旧的替换片段?我只想要记忆中的一个。或者我们可以说;我要消灭他们

+1

“事实上,片段本身被破坏和gc'ed并不意味着你分配的所有资源也被删除”([1](http://stackoverflow.com/a/18352625/2668136)) - “发生这种情况因为具有UI的片段将持有对UI组件[视图]的引用,并且这些视图持有活动的上下文的引用“([2](http://stackoverflow.com/a/28834362/2668136)) - ”[活动:一个新的环境,旧的意图是垃圾收集]现在不能垃圾回收,因为你的碎片仍然有一个旧的引用。“ ([3](http://stackoverflow.com/a/13422819/2668136)) – Fllo

+0

@Fllo感谢您的解释。所以我将分配每个上下文引用变量为null在每个片段中的ondestroyview –

+0

@Fllo所以我将每个UI元素分配给null,它看起来没有太大的变化。我改变的是,创建一个名为mainView的变量,并在onCreateView inflater.inflate中分配。然后在onDestroyView中分配这个变量null它看起来有点不同。我究竟做错了什么? –

回答

1

直到你死的活动,一切以片段的引用将 存在于内存中。无论在 片段管理器级别/ backstack中发生的添加/删除操作如何。

有由Martín Marconcinithis堆栈溢出的答案看看。

解决方法可以隐藏并显示它们是否存在于后端堆栈中。 看一下this