【问题标题】:Android ListView Memory Leak?Android ListView 内存泄漏?
【发布时间】:2012-06-06 09:24:06
【问题描述】:

我已经实现了一个分段列表视图,因此每个部分都有一个使用 this guide 的适配器,并且可能会导致视图在滚动时一遍又一遍地分配而不是重复使用,因为有不同的适配器(但在滚动时回来,它重用但对于同一个适配器),它的 getView 方法是这样的(简化):

        Map< String, ? > object = null;
        String id = null, title = null, rating = null, pic_url = null;
        object = sectionContent.get(position).getMap();
        id = (String) object.get(EventRowValues.ROW_ID);
        title = (String) object.get(EventRowValues.ROW_TITLE);
        pic_url = (String) object.get(EventRowValues.ROW_PIC_URL);

        View hView = convertView;
        if ( hView == null ) {
            hView = mInflater.inflate(R.layout.popularity_row, null);
            ViewHolder holder = new ViewHolder();
            holder.pic = (ImageView) hView.findViewById(R.id.icon);
            holder.title = (TextView) hView.findViewById(R.id.label);
            hView.setTag(holder);
        }

        final ViewHolder holder = (ViewHolder) hView.getTag();

        holder.id = id;

        mImageWorker.loadImage(pic_url, holder.pic);

        holder.title.setText(title);

        return hView;

loadImage 方法来自this google example

问题是当我滚动时它会占用越来越多的内存,例如 5-10 行需要 2 MB。当我向后滚动时,它不会占用更多内存,但据我所知,它不应该分配如此多的内存,因为它会重用视图,因为我希望它在加载时以及滚动以使用时占用内存来自缓存的相同视图和位图(因为大部分可绘制对象是从缓存返回的相同对象)。

可能是什么问题? 还有其他更智能的可重用分段列表视图选项吗?

非常感谢。

【问题讨论】:

  • 那么我的解决方案解决了你的问题吗?

标签: android listview memory-management android-listview drawable


【解决方案1】:

试试这个:更新:

        ViewHolder holder = new ViewHolder();

        if ( convertView == null ) {
            holder = new ViewHolder();
            hView = mInflater.inflate(R.layout.popularity_row, null);
            holder.pic = (ImageView) hView.findViewById(R.id.icon);
            holder.title = (TextView) hView.findViewById(R.id.label);
            hView.setTag(holder);
        } else {
            holder = (ViewHolder) view.getTag();
        }

PS: 你已经创建了两次 holder 对象。真的需要吗?

你用的是哪个android版本,因为我也有同样的问题,我用的是11版,在更高版本上,如果你想能够快速滚动列表,你需要在@中给出android:hardwareAccelerated="true"属性清单文件中的 987654324@。

【讨论】:

  • 谢谢,但这段代码和我的有什么区别?即使在不需要的情况下,您也会分配持有人。你的意思是API级别? android:hardwareAccelerated 是做什么的?谢谢
  • 请看我更新的代码。在这里,我只创建了一个持有者对象并在后续调用中使用它。创建一个对象并为其赋值是有区别的。在这里,我只创建了第一次对象,并为其分配了值以供后续调用。硬件加速请阅读:developer.android.com/guide/topics/graphics/hardware-accel.html
  • 谢谢,我在找到有趣的见解后更新了问题。
【解决方案2】:

想通了, 我使用的是我之前提到的指南中的分段表格视图,它不会正确重用单元格。我用一些补丁实现了一个 ExpandableListView 以使其工作,现在它很棒。

谢谢。

【讨论】:

    【解决方案3】:

    注释掉 mImageWorker.loadImage(pic_url, holder.pic);并显示内存消耗的差异

    【讨论】:

    • 消费是一样的。 7MB 用于滚动列表(30 项)。可能分配视图本身和它的 imageViews 是造成这种消耗的原因,并且可能正在分配单元格而不是重用单元格(但是当我向后滚动时它仍然是 7MB)。
    • 我已经从 xml 中删除了 imageViews 以及与这些视图对应的代码,现在这个列表需要 3MB...仍然太多...
    • 每新增 10 行是否仍会加载高达 2 mb 的空间?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多