13

thisと同様の質問ですが、解決策は機能しません。

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 が独自のドキュメントで推奨しているように、キャッシュの目的で、WeakReferences または WeakHashMaps を使用しています。しかし、Dalvik VM はこれらの参照を強制終了するには少し熱心すぎて、毎回再構築されるようです。これは、巨大な GC アクティビティとユーザー エクスペリエンスの低迷を説明しています。

リンク: バグによる役に立たない WeakReferences に関するブログ: 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 に答える