为什么在静态变量中缓存膨胀的布局可能是内存泄漏?

时间:2012-07-31 08:30:59

标签: android layout layout-inflater

我需要预加载复杂的布局,以便我可以在第一次更快地显示活动:

LayoutInflater inflater = (LayoutInflater) mainActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

SlowActivity.cachedView = inflater.inflate(R.layout.activity_layout, null, false);

当SlowActivity开始时......

public static View cachedView = null; 

@Override
public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);
        setContentView(this.cachedView);
      }
}

我找不到我读到的地方,但是有人说我正在使用stati变量进行内存泄漏来存储膨胀的布局。

为什么?

也许我需要在活动被销毁时释放一些资源(从来没有,它总是放在后台......)

2 个答案:

答案 0 :(得分:3)

这是因为布局与所有视图一样,都引用了包含它的活动。

因此,在活动关闭并且应该被释放之后,静态变量保存对引用此活动的视图的引用,因此应用程序占用的内存超出应有的数量。

视图不是您应该尝试避免使用静态变量进行缓存的唯一变量。一个例子是drawables,如here所示。

答案 1 :(得分:1)

因为Android每次需要内存时都可以(并且会)破坏你的应用程序/活动(包括静态变量!)。所以当你需要创建静态变量时,你必须考虑它。否则,在应用程序处于非活动状态后,您会发现很奇怪且很难找到崩溃。