Android: Image cache strategy and memory cache size Android: Image cache strategy and memory cache size android android

Android: Image cache strategy and memory cache size


Don't do it! SoftReference is already enough! Actually SoftReference is designed to do exactly what you need.Sometimes SoftReference doesn't do what you need. Then you just get rid of SoftReference and write your own memory management logic. But as far as you use SoftReference you should not be worried about memory consumption, SoftReference does it for you.


I am using one-third of the heap for Image cache.

int memoryInMB = activityManager.getMemoryClass();long totalAppHeap = memoryInMB * 1024 * 1024;int runtimeCacheLimit =  (int)totalAppHeap/3;

By the way, about soft reference, in Android Soft references do not work as you expect. There is a platform issue that soft references are collected too early, even when there is plenty of memory free.

Check http://code-gotcha.blogspot.com/2011/09/softreference.html


I've been looking into different caching mechanisms for my scaled bitmaps, both memory and disk cache examples. The examples where to complex for my needs, so I ended up making my own bitmap memory cache using LruCache. You can look at a working code-example here or use this code:

Memory Cache:

public class Cache {    private static LruCache<Integer, Bitmap> bitmaps = new BitmapLruCache();    public static Bitmap get(int drawableId){        Bitmap bitmap = bitmaps.get(drawableId);        if(bitmap != null){            return bitmap;          } else {            bitmap = SpriteUtil.createScaledBitmap(drawableId);            bitmaps.put(drawableId, bitmap);            return bitmap;        }    }}

BitmapLruCache:

public class BitmapLruCache extends LruCache<Integer, Bitmap> {    private final static int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);    private final static int cacheSize = maxMemory / 2;    public BitmapLruCache() {        super(cacheSize);    }    @Override    protected int sizeOf(Integer key, Bitmap bitmap) {        // The cache size will be measured in kilobytes rather than number of items.        return bitmap.getRowBytes() * bitmap.getHeight() / 1024;    }}