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
也不释放。所以过了一会儿,如果我点击每个菜单项并一次又一次打开碎片,内存使用量会增加很多。
所以我的问题是如何释放旧的替换片段?我只想要记忆中的一个。或者我们可以说;我要消灭他们
“事实上,片段本身被破坏和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
@Fllo感谢您的解释。所以我将分配每个上下文引用变量为null在每个片段中的ondestroyview –
@Fllo所以我将每个UI元素分配给null,它看起来没有太大的变化。我改变的是,创建一个名为mainView的变量,并在onCreateView inflater.inflate中分配。然后在onDestroyView中分配这个变量null它看起来有点不同。我究竟做错了什么? –