本文将介绍图片的内存缓存技术:LruCache和软引用的使用
1、软引用
我们一般用内存来缓存图片都是通过使用HashMap这个集合来保存图片的Url和图片对应的Bitmap对象
,但是当我们需要缓存很多图片的时候,那么问题就来了,由于Map里面保存的是Bitmap对象的强引用,
所有导致dvm虚拟机的垃圾回收机制在内存溢出的时候无法回收Map里面的对象,导致内存溢出,程序就会
崩掉。造成这样的就是因为Map里面保存的是Bitmap对象的强引用导致的。
如何解决这一问题?其实很简单,map里面的值里面放的是持有软引用的Bitmap
软引用就是当dvm虚拟机内存不足的时候,就会释放软引用的对象的内存空间
private Map<String,SoftReference<Bitmap>> mapCache;
再通过如下代码,往map中存入图片:
SoftReference<Bitmap> softBitmap=new SoftReference<Bitmap>(bitmap); mapCache1.put(imagePath, softBitmap);
再通过如下代码,从map中取出图片:
SoftReference<Bitmap> softBitmap=mapCache1.get(imagePath); if(softBitmap!=null){ Bitmap bitmap=softBitmap.get(); }
2.LruCache
在过去,我们经常会使用一种非常流行的内存缓存技术的实现,即软引用或弱引用 (SoftReference or WeakReference)。但是现在已经不再推荐使用这种方式了,
因为从 Android 2.3 (API Level 9)开始,垃圾回收器会更倾向于回收持有软引用或弱引用的对象,这让软引用和弱引用变得不再可靠。
另外,Android 3.0 (API Level 11)中,图片的数据会存储在本地的内存当中,因而无法用一种可预见的方式将其释放,这就有潜在的风险造成应用程序的内存溢出并崩溃。
所以现在推崇使用LruCache这个api去解决图片的内存缓存
其实LruCache跟HashMap使用方法一样,下面我们就来使用LruCache来进行图片的内存缓存
首先我们要创建出LruCache对象:
private LruCache<String, Bitmap> mapCache;//计算每个应用对应的虚拟机dvm所分配的内存空间int maxMemory = (int) Runtime.getRuntime().maxMemory();
int mCacheSize = maxMemory / 8;
mapCache = new LruCache<String, Bitmap>(mCacheSize) { @Override protected int sizeOf(String key, Bitmap value) { return value.getRowBytes() * value.getHeight(); } };
创建出LruCache对象,并重写它的sizeOf方法,此方法用来衡量每张图片的大小,mCacheSize是LruCache对象最大能缓存的内存空间大小
再通过如下代码往LruCache中存入图片:
mapCache.put(imagePath, bitmap);
再通过如下代码从LruCache中取出图片:
mapCache.get(imagePath);
注意:当存储Image的大小大于LruCache设定的值,系统自动释放内存,
这个类是3.1版本中提供的,如果你是在更早的Android版本中开发,则需要导入android-support-v4的jar包。