google在安卓2.3.x 之后修改了软引用的机制,而推荐使用LruCache
LruCache 可以看成是一个map集合,可以自动删除对象,在构造的时候会指定尺寸,超出尺寸的会删除
既然有尺寸,但也不能写死,这个大小就要和内存有关;
获取内存大小
Runtime runtime = Runtime.getRuntime();
runtime有三个参数,分别是
runtime.freeMemory(); 已经分配的 减去 已经使用的
runtime.totalMemory(); 已经分配的
runtime.maxMemory(); 可能分配的最大内存
使用的一个例子
// 使用操作系统能够分配给此应用的最大内存的二十分之一
LruCache<String, byte[]> cache = new LruCache<String, byte[]>((int) (runtime.maxMemory() / 20))
{
@Override
protected int sizeOf(String key, byte[] value) {
// 返回value的长度,表示 B 缓存中允许 (按照大小来计算)
return value.length;
// 默认返回1 ,认为所有的键值对都是等价的
// return super.sizeOf(key, value); (按照个数来计算)
}
};
就拿图片来做一个对比
直接将图片放进内存
HashMap<String, byte[]> cache = new HashMap<String, byte[]> ();
使用弱引用概念进行内存优化
HashMap<String, SoftReference<byte[]>> cache = new HashMap<String, SoftReference<byte[]>>();
使用LruCache概念进行内存优化(如上)