在Android方向改变后使用ViewHolder模式会导致内存泄漏吗?

时间:2015-11-02 08:09:32

标签: android listview memory-leaks android-orientation

来自https://developer.android.com/training/improving-layouts/smooth-scrolling.html#ViewHolder

> A ViewHolder object stores each of the component views inside the 
> tag field of the Layout, so you can immediately access them without 
> the need to look them up repeatedly. 

在android中更改orientatin后,将重新创建listview,以便列出所有listview项 迷路了。

示例:

/** ViewHolder attached to ListView-Item.tag */
public static class MyViewHolder {
    /** the image belonging to ListView-Item */
    ImageView mListViewItemImage;
}

我的问题:这会导致内存泄漏,因为存在循环引用:

  • ListView-Item.tag引用MyViewHolder
  • MyViewHolder.mListViewItemImage引用方向更改后丢弃的旧gui。

如果这导致内存泄漏,我是否必须实现ViewHolder垃圾回收?

1 个答案:

答案 0 :(得分:0)

此模式不使用静态变量,只有类是静态内部类。

在您提到的参考文献中,明确指出您应该像这样创建ViewHolder类的实例:

ViewHolder holder = new ViewHolder();

然后你将拥有一个ViewHolder类的实例,这意味着垃圾收集器可以收集它,因此如果没有更多的引用,它将不会保留在内存中。如果ViewHolder实例没有对它的引用,则可以收集它,以及仅包含来自ViewHolder对象(ImageViews)的引用的对象。

所以我的一般答案是:ViewHolder模式,如果你正确使用它不会导致内存泄漏。