【问题标题】:understanding fragments back stack and memory理解碎片回栈和内存
【发布时间】: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


【解决方案1】:

关于backstack的理解,请参考android核心工程师的this SO answer,它可能会给你一些帮助。

【讨论】:

    猜你喜欢
    • 2011-07-25
    • 2010-12-13
    • 1970-01-01
    • 2010-09-08
    • 2013-08-14
    • 2012-04-03
    • 2011-12-13
    • 2017-01-29
    • 1970-01-01
    相关资源
    最近更新 更多