2

我有一个带有 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 时不应该增加内存吗?
我还尝试使用以下方法清除 backstack:

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

但没有任何改变。我还检查了onDestroy在返回时在每个片段上调用的,并且它正在被调用。

有人可以帮助理解这一点吗?我使用了错误的模式还是什么?

4

1 回答 1

0

要了解 backstack,请参阅 android 核心工程师的这个 SO 答案,它可能会为您提供一些帮助。

于 2014-01-01T06:14:18.683 回答