【发布时间】:2011-05-12 12:07:34
【问题描述】:
我有一个使用自定义适配器的 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
似乎出了什么问题?
编辑@12:47 GMT:
事实上,它比这稍微复杂一些。我的应用程序 UI 基于 2 个部分。一个是屏幕的大脑,创建视图,处理用户输入等。另一个是Fragment,如果设备有android 3.0,否则它是Activity。
GC 发生在我的 Nexus One 2.3.3 设备上,因此使用 Activity。我没有 Xoom 来测试 Fragment 的行为。
如果需要,我可以发布源代码,但让我尝试解释一下:
-
RootList是 UI 的大脑。它包含 :-
List<>将被放置在ListView中的项目。 - 从 SQLite db 构建此列表的方法
- 一个自定义的 BaseAdapter,基本上只包含上面粘贴的 getView 方法
-
-
RootListActivity是ListActivity,其中:- 使用 XML 布局
- 布局当然有一个列表视图,ID为
android.id.list -
Activity回调使用创建活动时创建的 RootList 实例(构造函数,而不是onCreate)转发到RootList类 - 在
onCreate中,我调用RootList的方法来创建项目列表,并将列表数据设置为从BaseAdapter派生的自定义类的新实例
格林威治标准时间 5 月 17 日晚上 9:36 编辑:
这是 Activity 的代码和执行这些操作的类。 http://pastebin.com/EgHKRr4r
【问题讨论】:
-
你自己打电话给GC吗?我在我的 ListViews 中使用了更复杂的对象,而且它总是非常流畅(在发布模式下)。
-
getViewTypeCount() 的结果是什么? developer.android.com/reference/android/widget/…
-
@Dave:我自己没有打电话给 GC。我粘贴了整个 getView 方法。 @Ahmet Alp Balkan:getViewTypeCount() 返回 1。
-
你的图标有多大(文件大小)?
-
真的很小。在 hdpi 中它是 32x32 PNG,大约 1.1kByte
标签: android listview garbage-collection