1

アダプターを使用して ImageViews のリストを作成する ListView があります。私は次の標準的な慣行に従っています:

a) convertView が null の場合にのみ新しいビューをインフレートし、

b) convertView が null でない場合、viewHolder を使用して findViewById() の呼び出しを回避する

また、AsyncTask を使用して、データベース (または、可能であればディスク キャッシュまたは LRU メモリ キャッシュ) から ImageView を設定しています。

しばらくの間はすべて正常に動作します (つまり、画像がスムーズにスクロールしてリストに表示されます) が、約 70 x 1.4M の画像が読み込まれた後に OOM エラーが発生するリークがあります。

私の理解では、getView() が null 以外の convertView を返すと ListViews がリサイクルされるため、このようにメモリが蓄積されることはありません。私の場合、ImageView にビットマップが割り当てられるたびに、アプリのメモリ使用量が増加します。実際、アクティビティは、list.clear() を介して基になるリストをクリアし、adapter.notifyDataSetInvalidated() を介してアダプターをゼロにした後でも、このメモリを保持します-両方とも onStop() 関数で。

MAT ツールは、孤立したビットマップと孤立した ImageView を表示します (読み込まれた画像とほぼ 1 対 1) が、古いビューのガベージ コレクションを妨げる参照を保持しているものはわかりません。

このリークを追跡する方法についての提案をいただければ幸いです。ありがとう!

4

0 に答える 0