【发布时间】:2013-09-26 00:29:43
【问题描述】:
我有一个带有 FrameLayout 的活动,其中在导航期间替换片段,如下所示:
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
// ...
// fragMap is a HashMap<String,Class<?>> mapping fragments classes
Fragment frag;
Class<?> classa = fragMap.get(s);
frag = (Fragment) classa.newInstance();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right ,R.anim.slide_in_right, R.anim.slide_out_left);
ft.addToBackStack(null);
ft.replace(R.id.fragcontainer, frag);
ft.commit();
按下后退按钮时,反向事务触发,一切正常。
创建活动时,第一个片段 A 被加载,内存使用量约为 20mb,然后我将 A 替换为 B,将 B 替换为 C,内存增加到 ~40mb。
当我按下返回按钮直到显示片段 A 时,我希望内存使用量回到 ~20mb(就像活动一样),但它仍然停留在 ~40mb。如果再次通过 B 和 C 导航,它不会改变,仍然是 ~40mb。
我真的不明白这种行为,如果碎片泄漏,每次我从 A 到 B 到 C 时不应该增加内存?
我还尝试使用以下方法清除后台堆栈:
getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
但没有任何改变。我还检查了导航返回时是否在每个片段上调用了onDestroy,并且正在调用它。
有人可以帮助理解这一点吗?是我使用了错误的模式还是什么?
【问题讨论】:
-
嗨 lelloman,你有什么解决办法吗?
-
@Amrendra 嘿,我实际上没有得到解决方案,但我没有遇到任何问题(从未遇到内存不足异常),所以我认为这是正常行为。我只是想知道为什么会这样,你有什么实际问题还是只是好奇?
-
@lleloman 这不仅仅是好奇,我也有同样的问题,而且从来没有出现过内存不足的异常。即使在活动销毁后,内存也不会被 GC 释放
-
@Amrendra 是的,这听起来像是同样的情况,我的意思是,只要你没有出现内存不足异常,我们可以假设情况在控制之下(由 android 框架)。您可以尝试越来越多地分配对象并查看碎片使用的内存是否被释放。如果你分配的内存加起来就是碎片使用的内存,那么你就有问题了
标签: android memory-leaks android-fragments