码迷,mamicode.com
首页 > 系统相关 > 详细

利用LruCache进行图片的内存缓存,避免OOM异常(内存溢出异常)

时间:2016-08-12 21:36:32      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:

本文将介绍图片的内存缓存技术: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包。

利用LruCache进行图片的内存缓存,避免OOM异常(内存溢出异常)

标签:

原文地址:http://www.cnblogs.com/Jsako/p/5766499.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!