リストビューで大量のガベージコレクションが発生する 質問する

リストビューで大量のガベージコレクションが発生する 質問する

カスタム アダプターを使用する 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 つの部分に基づいています。1 つは画面の頭脳で、ビューの作成、ユーザー入力の処理などを行います。もう 1 つは、Fragmentデバイスに Android 3.0 が搭載されている場合は 、そうでない場合は ですActivity

GC は Nexus One 2.3.3 デバイスで発生したため、 を使用しましたActivity。 動作をテストするために Xoom を持っていないので、を使用できませんFragment

必要であればソースを投稿することもできますが、説明させてください。

  • RootListUI の頭脳です。次のものが含まれます:
    • List<>に配置されるアイテムの一覧ですListView
    • SQLiteデータベースからこのリストを構築する方法
    • 基本的に上記に貼り付けたgetViewメソッドのみを含むカスタムBaseAdapter
  • RootListActivityは でありListActivity、次のように なります。
    • XMLレイアウトを使用する
    • レイアウトには当然ID付きのリストビューがありますandroid.id.list
    • コールバックは、アクティビティの作成時に作成された RootList のインスタンスを使用してクラスActivityに転送されます(コンストラクターではありません)RootListonCreate
    • では、アイテムのリストを作成する のメソッドをonCreate呼び出し、リストデータを から派生したカスタムクラスの新しいインスタンスに設定します。RootListBaseAdapter

5月17日午後9時36分GMT編集:

以下は、アクティビティと、それを実行するクラスのコードです。http://pastebin.com/EgHKRr4r

ベストアンサー1

問題が見つかりました。アクティビティの 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がなくなり、スクロールがスムーズ! :)

このパラメータがなぜ設定されたのかはよくわかりません。必要ないからです。XML レイアウトを実際に構築するのではなく、コピー&ペーストしすぎたのかもしれません。

ご支援ありがとうございます。本当に感謝しています。

おすすめ記事