Android ListView内存泄漏?

时间:2012-06-06 09:24:07

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

我已经实现了一个分段列表视图,以便每个部分都有一个使用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

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

可能是什么问题? 智能可重用分区listView的其他选项吗?

非常感谢。

3 个答案:

答案 0 :(得分:2)

试试这个:更新:

        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:您已经创建了两次持有者对象。真的需要吗?

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

答案 1 :(得分:2)

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

感谢。

答案 2 :(得分:1)

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