2012-01-31 3 views
1

私はアンドロイドのアプリでグリッドビューを持っています。私はサーバからグリッドビューにイメージをロードしています。遅延読み込みを使用しています。ここで作成されたすべてのビットマップをリサイクルする必要があります.AdapterまたはGridビューでBitmap.recycle()を実行する方法。私は記憶がなくなり、助けてください。グリッドビューアダプタでビットマップをリサイクルする方法は?

答えて

6

コードを表示する必要があります(アダプターは最低限必要です)。メモリエラーが発生している場合は、ビューのリサイクルを正しく実装していないか、メモリリークが発生している可能性があります。一度にたくさんの大きなビットマップをロードするだけでも可能ですが、ビューをロードすることができれば、メモリリークが発生する可能性が非常に高くなります。

誰かがコードを見ずにメモリリークを追跡することはできません。 Bitmap.recycle()は解決策ではありません。ガベージコレクタはコードの残りの部分が正常であれば十分に機能します。

参照:http://www.youtube.com/watch?v=_CruQY55HOkアンドロイドのメモリ管理とメモリリークの発見に関する素晴らしい話は、http://www.youtube.com/watch?v=_CruQY55HOkをご覧ください。

http://android-developers.blogspot.com/2010/07/multithreading-for-performance.htmlまた、画像をビューのようなリストにダウンロードしたり正しく非同期に読み込んだりする方法の例については、試してみてください。

編集:また、私が書いたイメージロードライブラリをチェックアウトするので、あなたは、このいずれかを心配する必要はありません。https://github.com/bumptech/glide

5

Displaying Bitmaps Efficiently Androidのトレーニングクラスをご覧ください。バックグラウンドスレッドとメモリとディスクキャッシュを使用してGridViewにビットマップを表示することをカバーするレッスンDisplaying Bitmaps in your UIを持っています。非常にうまく機能本当に簡単な方法はあり

2

:ビットマップへのポインタを維持し、古いものをリサイクル

public class ImageViewRecyclable extends ImageView 
{ 
    private Bitmap bitmap; 

    public ImageViewRecyclable(Context context) 
    { 
     super(context); 
    } 

    @Override 
    public void setImageBitmap(Bitmap bm) 
    { 
     super.setImageBitmap(bm); 
     if (bitmap != null) bitmap.recycle(); 
     this.bitmap = bm; 
    } 
} 

当社ImageViewRecyclable:

まず、あなたは、このようなカスタムImageViewのを作成する必要があります新しいものを設定する前に。

第2に、convertViewがnullかどうかを確認するには、アダプタのgetViewをチェックインする必要があります。カスタムのImageViewRecyclableにnullがキャストされていない場合は、その上にビットマップを設定します。この方法で古いビットマップをリサイクルしてから新しいビットマップを設定します。

これは、アダプタのgetViewメソッドのコードです:

@Override 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    ImageViewRecyclable imageView = (convertView == null) ? new ImageViewRecyclable(ActivityMain.this) : (ImageViewRecyclable) convertView; 
    byte[] bytes = .... 
    Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 
    imageView.setImageBitmap(bitmap); 

    return imageView; 
} 

私が1000枚の100x100の画像でこのコードをテストしました。元のImageViewはメモリエラーで50のイメージを表示した後に失敗しましたが、このコードはグリッドの最後までうまく動作します。

このコードは、小さなオフライン画像では非常に効果的ですが、オンラインや大きな画像にはキャッシングなどが必要です。これは便利ですが、いくつかの変更を適用する必要があります。

関連する問題