13

这是一个与此类似的问题但该解决方案不起作用。

问题是滚动ListView非常缓慢,这是因为有很多 GC。我使用持有人模式(视图缓存),如下面的代码所示:

public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder holder;

    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.eventrow, parent, false);

        holder = new ViewHolder();

        holder.title = (TextView) convertView.findViewById(R.id.eventTitle);
        holder.place = (TextView) convertView.findViewById(R.id.eventPlace);

        convertView.setTag(holder);
    } else {
        // Get the ViewHolder back to get fast access to the TextView
        // and the ImageView.
        holder = (ViewHolder) convertView.getTag();
    }

    // Bind the data efficiently with the holder.
    holder.title.setText(((EventItem) getItem(position)).getTitle());
    holder.place.setText(((EventItem) getItem(position)).getPlace_name());

    return convertView;
}

cacheColorHint从列表视图和行中删除了自定义选择器:

<ListView
android:id="@+id/android:list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>

这是日志的样子:

08-20 19:36:24.286: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed 364K, 46% free 3944K/7239K, external 1196K/1445K, paused 54ms
08-20 19:36:24.356: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed 228K, 49% free 3716K/7239K, external 1721K/1970K, paused 52ms
08-20 19:36:24.456: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed 5K, 49% free 3726K/7239K, external 2214K/2463K, paused 50ms
08-20 19:36:24.546: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed 2K, 49% free 3726K/7239K, external 2214K/2463K, paused 43ms
08-20 19:36:24.636: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed 2K, 49% free 3726K/7239K, external 2214K/2463K, paused 44ms
08-20 19:36:24.696: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed <1K, 49% free 3726K/7239K, external 2214K/2463K, paused 50ms
08-20 19:36:24.766: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed <1K, 49% free 3726K/7239K, external 2214K/2463K, paused 46ms
08-20 19:36:24.846: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed <1K, 49% free 3726K/7239K, external 2214K/2463K, paused 46ms
08-20 19:36:24.906: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed <1K, 49% free 3726K/7239K, external 2214K/2463K, paused 46ms
08-20 19:36:24.986: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed <1K, 49% free 3726K/7239K, external 2214K/2463K, paused 46ms
08-20 19:36:25.056: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed <1K, 49% free 3726K/7239K, external 2214K/2463K, paused 47ms
08-20 19:36:25.136: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed <1K, 49% free 3726K/7239K, external 2214K/2463K, paused 46ms
08-20 19:36:25.196: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed <1K, 49% free 3726K/7239K, external 2214K/2463K, paused 46ms
08-20 19:36:25.296: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed <1K, 49% free 3726K/7239K, external 2214K/2463K, paused 48ms
08-20 19:36:25.356: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed <1K, 49% free 3726K/7239K, external 2214K/2463K, paused 43ms
08-20 19:36:34.596: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed 7K, 49% free 3740K/7239K, external 2214K/2463K, paused 51ms
08-20 19:36:34.656: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed 1K, 49% free 3739K/7239K, external 2214K/2463K, paused 50ms
08-20 19:36:34.746: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed <1K, 49% free 3739K/7239K, external 2214K/2463K, paused 50ms

编辑: 似乎问题(几乎)仅在第ListFragment一次膨胀时才出现。第一次向下滚动然后向上滚动。在那之后,GC 就不那么频繁了。但有时每次滚动时都会出现 GC。我看不出这里没有规律。 另外,我可以在 HTC Desire (2.3.7 MIUI) 上看到问题,但在 Sasmung Galaxy ACE (2.1) 上看不到它只会变得更加混乱......

不太令人满意的解决方案: 当我使用

android:scrollingCache="false"
android:animationCache="false"

在我的列表视图中似乎没问题。但是文档说,如果我理解得很好,那应该是完全不同的,所以我有点困惑。

我在哪里犯错?怎样做才能有一个平滑的滚动列表视图?或者禁用会scrollingCache产生一些我现在看不到的负面影响?

4

3 回答 3

3
android:scrollingCache="false"

是解决办法。

文档说:

设置为 true 时,列表在滚动期间使用绘图缓存。这使渲染速度更快,但使用更多内存。

现在这并没有给我们任何关于实现细节的提示。我有一个想法,无需投入数小时的代码分析。出于缓存目的,就像 Google 在他们自己的文档中推荐的那样,他们使用 Wea​​kReferences 或 WeakHashMaps。但是看起来 Dalvik VM 有点太急于杀死这些引用并导致它们每次都被重建。这解释了巨大的 GC 活动和缓慢的用户体验。

链接:关于由于 bug 导致的无用 Wea​​kReferences 的博客:http: //chriswstewart.com/post/14199645893/improving-the-android-listview Dalvik VM 错误讨论:https ://groups.google.com/forum/#!topic/安卓开发者/66uw2t84rME

于 2012-09-13T08:15:16.363 回答
1

确保 ListView 后面的任何内容都有背景和/或 windowBackground,我之前已经看到过这样的问题。

于 2012-09-12T15:46:48.030 回答
-1

尝试

listView.setCacheColorHint(0);

         &
protected void onDestroy() {
        System.gc();

        super.onDestroy();
    }
于 2012-09-12T13:35:31.480 回答