理解片段回堆栈和内存

时间:2013-09-20 14:53:25

标签: android memory-leaks android-fragments

我有一个带有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,然后我用B替换A,用C替换B,内存增加到~40mb。
当我按下后退按钮直到显示片段A时,我预计内存使用量会回到~20mb(就像活动一样),但它仍然停留在~40mb。如果再次通过B和C导航,它不会改变,仍然是〜40mb。
我真的不明白这种行为,如果碎片泄漏,每次从A到B到达时都不应该记忆提高C?
我还尝试用以下方法清除背包:

getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

但没有任何改变。我还检查了导航回来时每个片段都调用了onDestroy,并且正在调用它。

有人可以帮忙理解这个吗?我使用的是错误的模式还是什么?

1 个答案:

答案 0 :(得分:0)

要了解backstack,请参阅android核心工程师的this SO answer,它可能会给你一些帮助。