今日は Caching Bitmaps
です。
一度に多くの画像をロードする場合
メモリを使いすぎないよう効率的に使う為に
キャッシュを利用するという内容です。
まず、メモリーキャッシュを利用する場合
メモリーキャッシュなのでアクセス速度は速いです。
その代わり、容量が限られます。
ので、迅速なレスポンスが必要な箇所に最低限に
使用するのが良いと思います。
private LruCache<String, Bitmap> mMemoryCache;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
最大メモリの8分の1だけをメモリキャッシュに利用
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
final int cacheSize = maxMemory / 8;
最大を超えた場合 OutOfMemory 例外を出す。
mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getByteCount() / 1024;
}
};
...
}
キャッシュに追加
public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
if (getBitmapFromMemCache(key) == null) {
mMemoryCache.put(key, bitmap);
}
}
キャッシュからビットマップを取得
public Bitmap getBitmapFromMemCache(String key) {
return mMemoryCache.get(key);
}
ビットマップのロードの際キャッシュに存在するかのチェックを追加
public void loadBitmap(int resId, ImageView imageView) {
final String imageKey = String.valueOf(resId);
final Bitmap bitmap = getBitmapFromMemCache(imageKey);
if (bitmap != null) {
ある場合キャッシュから取得
mImageView.setImageBitmap(bitmap);
} else {
無い場合ビットマップをロード
mImageView.setImageResource(R.drawable.image_placeholder);
BitmapWorkerTask task = new BitmapWorkerTask(mImageView);
task.execute(resId);
}
}
ビットマップをロードする際にキャッシュに追加するように修正
class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
...
@Override
protected Bitmap doInBackground(Integer... params) {
final Bitmap bitmap = decodeSampledBitmapFromResource(
getResources(), params[0], 100, 100));
addBitmapToMemoryCache(String.valueOf(params[0]), bitmap);
return bitmap;
}
...
}
次回はディスクキャッシュの方法です。
本日はこれまで。