0

Androidでプログラムによってキャッシュされた画像をメモリからクリアするにはどうすればよいですか?

スクロールするListViewと画像がリロードされます。だから、それはを生成し OutofMemoryErrorます。この例外を取得している間、キャッシュをクリアしたい。どうやってするか?何か助けはありますか?

編集:

私は自分のプログラムでこのコードを使用して画像をロードしています:http: //ballardhack.wordpress.com/2010/04/10/loading-images-over-http-on-a-separate-thread-on-android/

4

3 に答える 3

2

ListViewでビットマップオブジェクトを再利用していますか?

Romain Guyは、昨年のGoogle I / Oでのレイアウトとビューに関するAndroidの講演で、これがメモリとスムーズなパフォーマンスにとってどれほど重要であるかについて話しました。

基本的に、特定の数のビットマップオブジェクト(彼は8を使用)が必要であり、スクロールするときに次の画像をロードするたびに、消えたばかりのオブジェクトのオブジェクトに移動する必要があります。

画像のキャッシュは高速だと思うかもしれませんが、メモリの問題やガベージコレクションの問題が発生し、必然的にラグが発生します。

于 2010-05-28T22:48:56.297 に答える
2

うん...既知の「問題」、これがListViewの動作だとしましょう。

修正方法:

  1. ViewHolder について説明している @HXCaine の提案によるビデオの最初の 15 分間をご覧ください。

  2. 私が間違っていなければ、ビットマップがnullの場合、あなたの例はデフォルトの画像を設定する必要があります! この例では、これをビューに提供していないため、キャッシュされます。これはフレームワークで処理する必要がありますが、そうではありません:(。

コード例:

public class DebtAdapter extends BaseAdapter {
...

    @Override
        public View getView(int position, View convertView, ViewGroup parent) 
        {
            ViewHolder holder;
            Bitmap bitmap;

            if(convertView == null)  
            {
                convertView = inflater.inflate(viewResourceId, null);

                holder = new ViewHolder();
                holder.photo = (ImageView) convertView.findViewById(R.id.photo);

                convertView.setTag(holder);
            }
            else 
            {
                holder = (ViewHolder) convertView.getTag();
            }
            bitmap = item.getContact().getPhoto();
            if(bitmap != null)
            {
                holder.photo.setImageBitmap(bitmap);
            }
            else
            {
                holder.photo.setImageBitmap(null);
            }
            return convertView;
        }
}

お役に立てば幸いです。

于 2010-10-18T12:16:45.817 に答える
0

Bitmap を使用している場合は、 recycle メソッドを呼び出してメモリを解放できます。ただし、これで問題が解決するかどうかはわかりません。

于 2010-05-28T13:24:15.510 に答える