android – 在列表视图中的垃圾收集

我有一个使用自定义适配器的ListView。自定义适配器的getView使用所有推荐的做法:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    SuscriptionsViewsHolder holder;
    ItemInRootList item = mItemsInList.get(position);

    if (convertView == null) {
         convertView = mInflater.inflate(R.layout.label, null);

         holder = new SuscriptionsViewsHolder();
         holder.label = (TextView) convertView.findViewById(R.id.label_label);
         holder.icon = (ImageView) convertView.findViewById(R.id.label_icon);

        convertView.setTag(holder);
    } else {
        holder = (SuscriptionsViewsHolder) convertView.getTag();
    }

    String text = String.format("%1$s (%2$s)", item.title, item.unreadCount);
    holder.label.setText(text);
    holder.icon.setImageResource(item.isLabel ? R.drawable.folder : R.drawable.file );

    return convertView;
}

但是当我滚动时,由于垃圾收集很重,这是缓慢的:

GC_EXTERNAL_ALLOC freed 87K, 48% free 2873K/5447K, external 516K/519K, paused 30ms
GC_EXTERNAL_ALLOC freed 7K, 48% free 2866K/5447K, external 1056K/1208K, paused 29ms
GC_EXTERNAL_ALLOC freed <1K, 48% free 2866K/5447K, external 1416K/1568K, paused 28ms
GC_EXTERNAL_ALLOC freed 5K, 48% free 2865K/5447K, external 1600K/1748K, paused 27ms
GC_EXTERNAL_ALLOC freed <1K, 48% free 2865K/5447K, external 1780K/1932K, paused 30ms
GC_EXTERNAL_ALLOC freed 2K, 48% free 2870K/5447K, external 1780K/1932K, paused 26ms
GC_EXTERNAL_ALLOC freed 2K, 48% free 2870K/5447K, external 1780K/1932K, paused 25ms
GC_EXTERNAL_ALLOC freed <1K, 48% free 2870K/5447K, external 1780K/1932K, paused 26ms
GC_EXTERNAL_ALLOC freed 3K, 48% free 2870K/5447K, external 1780K/1932K, paused 25ms
GC_EXTERNAL_ALLOC freed <1K, 48% free 2870K/5447K, external 1780K/1932K, paused 29ms
GC_EXTERNAL_ALLOC freed <1K, 48% free 2870K/5447K, external 1780K/1932K, paused 29ms
GC_EXTERNAL_ALLOC freed <1K, 48% free 2871K/5447K, external 1780K/1932K, paused 28ms
GC_EXTERNAL_ALLOC freed <1K, 48% free 2871K/5447K, external 1780K/1932K, paused 26ms
GC_EXTERNAL_ALLOC freed <1K, 48% free 2870K/5447K, external 1780K/1932K, paused 27ms
GC_EXTERNAL_ALLOC freed <1K, 48% free 2870K/5447K, external 1780K/1932K, paused 29ms
GC_EXTERNAL_ALLOC freed <1K, 48% free 2870K/5447K, external 1780K/1932K, paused 26ms
GC_EXTERNAL_ALLOC freed <1K, 48% free 2870K/5447K, external 1780K/1932K, paused 34ms

什么似乎是错的?

EDIT @ 12:47 GMT:

其实它比这更复杂一些。我的应用程序UI基于2部分。一个是屏幕的大脑,创建视图,处理用户输入等。另一个是片段,如果设备有android 3.0,否则它是一个Activity。

GC在我的Nexus One 2.3.3设备上发生,所以使用活动。我没有我的Xoom与我一起测试片段的行为。

如果需要,我可以发布源,但是让我试着解释一下:

> RootList是UI的大脑。它包含 :

>列表<>将放置在ListView中的项目。
>从SQLite数据库生成此列表的方法
>一个自定义的BaseAdapter,它基本上只包含上面粘贴的getView方法

> RootListActivity是一个ListActivity,其中:

>使用XML布局
>布局当然有一个id为android.id.list的listview
>活动回调使用在创建活动时创建的RootList实例转发到RootList类(构造函数,而不是onCreate)
>在onCreate中,我调用RootList的方法来创建项目列表,并将列表数据设置为派生自BaseAdapter的自定义类的新实例

编辑可能17日@ 9:36 PM GMT:

这是Activity和执行事情的类的代码。 http://pastebin.com/EgHKRr4r

最佳答案
我发现了这个问题。我的XML布局的活动是:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <include android:id="@+id/rootlist_header" layout="@layout/pre_honeycomb_action_bar" />

    <ListView android:id="@android:id/list"
        android:layout_below="@id/rootlist_header"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:textColor="#444444"
        android:divider="@drawable/list_divider"
        android:dividerHeight="1px"
        android:cacheColorHint="#00000000" />

</RelativeLayout>

如果我删除了android:cacheColorHint =“#00000000”,那么重的GC是出来的,滚动是顺利的! 🙂

我不知道为什么这个参数被设置,因为我不需要它。也许我是copypasted太多,而不是实际构建我的XML布局。

谢谢你的支持,我非常感谢你的帮助。

转载注明原文:android – 在列表视图中的垃圾收集 - 代码日志