问题描述
我有一个使用自定义适配器的 ListView.自定义适配器的 getView 使用所有推荐的做法:
I have a ListView that uses a custom adapter. The custom adapter's getView uses all the recommended practices:
@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;
}
但是当我滚动时,由于垃圾收集繁重,它很慢:
However when I scroll, it is sluggish because of heavy garbage collection:
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:
EDIT @12:47 GMT:
事实上,它比这稍微复杂一些.我的应用程序 UI 基于 2 个部分.一个是屏幕的大脑,创建视图,处理用户输入等.另一个是 Fragment
如果设备具有 android 3.0,否则它是 Activity
.
In fact it's slightly more complicated than this. My app UI is based on 2 parts. One is the brain of a screen, creating the views, handling user input, etc. The other is a Fragment
if the device has android 3.0, otherwise it's an Activity
.
GC 发生在我的 Nexus One 2.3.3 设备上,因此使用 Activity
.我没有带 Xoom 来测试 Fragment
的行为.
The GC happened on my Nexus One 2.3.3 device, so using the Activity
. I don't have my Xoom with me to test the behaviour with a Fragment
.
如果需要,我可以发布源代码,但让我尝试解释一下:
I could post the source if required, but let me try to explain it :
RootList
是 UI 的大脑.它包含 :- 将放置在
ListView
中的项目的List<>
. - 从 SQLite db 构建此列表的方法
- 一个自定义的 BaseAdapter,基本上只包含上面粘贴的 getView 方法
RootList
is the brain of the UI. It contains :- a
List<>
of items that will be placed in theListView
. - a method that builds this list from a SQLite db
- a custom BaseAdapter that contains basically only the getView method pasted above
- 使用 XML 布局
- 布局当然有一个 ID 为
android.id.list
的列表视图 Activity
回调被转发到RootList
类,使用创建活动时创建的 RootList 实例(构造函数,而不是onCreate
)- 在
onCreate
中,我调用RootList
的方法来创建项目列表,并将列表数据设置为我的自定义类派生自BaseAdapter
- uses an XML layout
- the layout has of course a listview with id
android.id.list
- the
Activity
callbacks are forwarded to theRootList
class using an instance of RootList created when the activity is created (constructor, notonCreate
) - in the
onCreate
, I callRootList
's methods that will create the list of items, and set the list data to a new instance of my custom class derived fromBaseAdapter
格林威治标准时间 5 月 17 日晚上 9:36
EDIT on may 17th @ 9:36PM GMT:
这是 Activity 的代码和执行这些操作的类.http://pastebin.com/EgHKRr4r
Here's the code of the Activity and the class that does the things. http://pastebin.com/EgHKRr4r
推荐答案
我发现了问题.我的活动 XML 布局是:
I found the issue. My XML layout for the activity was:
<?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 出来了,滚动是 smooth!:)If I remove the
android:cacheColorHint="#00000000"
, the heavy GC is out, and the scrolling is smooth! :)我真的不知道为什么要设置这个参数,因为我不需要它.也许我复制粘贴太多,而不是实际构建我的 XML 布局.
I don't really know why this parameter was set, because I don't need it. Maybe I copypasted too much instead of actually build my XML layout.
感谢您的支持,非常感谢您的帮助.
THANK YOU for your support, I really appreciate your help.
这篇关于列表视图中的大量垃圾收集的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!
本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!- a
- 将放置在