Подтвердить что ты не робот

Множество GC при прокрутке ListView (с шаблоном держателя)

Это аналогичный вопрос , но решение не работает.

Проблема заключается в том, что прокрутка 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

EDIT: Кажется, что проблема возникает (почти) только тогда, когда сначала надувается ListFragment. Для первого прокрутки вниз и затем вверх. После этого GC не так часто. Но иногда GC появляются каждый раз, когда я прокручиваю. Я не вижу здесь никакой закономерности. PLUS Я вижу проблему на HTC Desire (2.3.7 MIUI), но не на Sasmung Galaxy ACE (2.1). Это только запутывает...

Не очень удовлетворительное решение: Когда я использую

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

в моем списке это выглядит нормально. Но документы говорят, что это должно быть совсем иначе, если я хорошо понимаю, поэтому я немного смущен.

Где я могу ошибиться? Что делать, чтобы иметь гладкий список прокрутки? Или отключение scrollingCache имеет некоторый негативный эффект, который я не вижу сейчас?

4b9b3361

Ответ 1

android:scrollingCache="false"

Это решение.

В документах говорится:

При установке значения true в списке используется кеш чертежа во время прокрутки. Эта делает рендеринг быстрее, но использует больше памяти.

Теперь это не дает нам никакого намека на детали реализации. У меня есть идея, не тратя время на анализ кода. Для целей кэширования, например, как рекомендует Google в своих собственных документах, они используют WeakReferences или WeakHashMaps. Но похоже, что Dalvik VM слишком охотно убивает эти ссылки и заставляет их перестраиваться каждый раз. Это объясняет огромную активность GC и вялый пользовательский интерфейс.

Ссылки: Блог о бесполезных WeakReferences из-за ошибки: http://chriswstewart.com/post/14199645893/improving-the-android-listview Обсуждение проблемы Dalvik VM: https://groups.google.com/forum/#!topic/android-developers/66uw2t84rME

Ответ 2

Удостоверьтесь, что у вас есть фон и/или windowBackground для всех, что находится за ListView, я видел такие проблемы, как это раньше.

Ответ 3

попробовать

listView.setCacheColorHint(0);

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

        super.onDestroy();
    }