Android開発記録雑記 -4ページ目

Android開発記録雑記

パソコン中級者ぐらいの私が
スマホアプリの開発をしてみようと思い立ち
Androidで動くアプリ開発過程をこれから書き記していきます。

今日は 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;
    }
    ...
}


次回はディスクキャッシュの方法です。

本日はこれまで。