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

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

时间: 2024-10-24 17:04:17

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

Android开发中图片的三级缓存策略

一.简介 现在的Android应用程序中,不可避免的都会使用到图片,如果每次加载图片的时候都要从网络重新拉取,这样不但很耗费用户的流量,而且图片加载的也会很慢,用户体验很不好.所以一个应用的图片缓存策略是很重要的.通常情况下,Android应用程序中图片的缓存策略采用"内存-本地-网络"三级缓存策略,首先应用程序访问网络拉取图片,分别将加载的图片保存在本地SD卡中和内存中,当程序再一次需要加载图片的时候,先判断内存中是否有缓存,有则直接从内存中拉取,否则查看本地SD卡中是否有缓存,SD

Android中图片的三级缓存策略

一.简介 现在的Android应用程序中,不可避免的都会使用到图片,如果每次加载图片的时候都要从网络重新拉取,这样不但很耗费用户的流量,而且图片加载的也会很慢,用户体验很不好.所以一个应用的图片缓存策略是很重要的.通常情况下,Android应用程序中图片的缓存策略采用"内存-本地-网络"三级缓存策略,首先应用程序访问网络拉取图片,分别将加载的图片保存在本地SD卡中和内存中,当程序再一次需要加载图片的时候,先判断内存中是否有缓存,有则直接从内存中拉取,否则查看本地SD卡中是否有缓存,SD

由LruCache和DiskLruCache提供三级缓存支持的ImageLoader

从三天前一直报错到今天中午,总算出了个能用的版本了. 一如既往先发链接: https://github.com/mlxy/ImageLoader 缓存处理 ·LruCacheHelper: 封装第一级缓存,也就是内存缓存的处理. LruCache是Android自带的缓存处理类,如名字所说,和使用软引用的映射相比,优势在于可以忽略缓存上限处理的细节问题,初始化时在构造函数中给一个缓存上限即可.一般做法是使用最大内存的八分之一: Runtime.getRuntime().maxMemory() /

Memory Cache(内存缓存)

当Google测试了Google Search服务的可用性后,发现速度是最影响Web应用的可用性的因素之一.相对于作用相同但是速度慢的应用,用户更喜欢速度快的应用.多来年,Google已经掌握了如何使应用运行更快,甚至是有上百万的用户访问这个应用.提高Web应用的速度的一个方法就是为存储使用分布式的内存缓存,而不是从磁盘中获取经常用的数据. 当你将信息放到DataStore上的时候,你的信息被永久地保存了,被保存在云中某个地方的磁盘中,甚至你的应用不在使用,也会被备份和维护. 内存缓存遍布于云中

【java虚拟机】java内存区域与内存溢出异常

本文参考自<深入理解Java虚拟机>一书.主要总结一下java虚拟机内存的各个区域,以及这些区域的作用.服务对象以及其中可能产生的问题. 1. 运行时数据区域 java虚拟机在执行java程序的过程中会把它说管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁.具体如下图所示: 结合这张图,下面逐个来分析一下每个数据区域的特点. 1.1 程序计数器(Program Counter

【转】图片缓存之内存缓存技术LruCache、软引用 比较

每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常,这个问题曾经让我觉得很烦恼,后来终于得到了解决,那么现在就让我和大家一起分享一下吧.这篇博文要讲的图片缓存机制,我接触到的有两钟,一种是软引用,另一种是内存缓存技术.先来看下两者的使用方式,再来作比较.除了加载图片时要用到缓存处理,还有一个比较重要的步骤要做,就是要先压缩图片. 1.压缩图片至于要压缩到什么状态就要看自己当时的处境了,压缩图片的时候既要达到一个小的值,又不能让其模糊,更不能拉伸图片. /** * 加载内存卡图片

转--图片缓存之内存缓存技术LruCache,软引用

每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常,这个问题曾经让我觉得很烦恼,后来终于得到了解决,那么现在就让我和大家一起分享一下吧.这篇博文要讲的图片缓存机制,我接触到的有两钟,一种是软引用,另一种是内存缓存技术.先来看下两者的使用方式,再来作比较.除了加载图片时要用到缓存处理,还有一个比较重要的步骤要做,就是要先压缩图片. 1.压缩图片至于要压缩到什么状态就要看自己当时的处境了,压缩图片的时候既要达到一个小的值,又不能让其模糊,更不能拉伸图片.    /**        

利用LruCache和DiskLruCache加载网络图片实现图片瀑布流效果(升级版)

MainActivity如下: package cc.patience7; import android.os.Bundle; import android.app.Activity; /** * Demo描述: * 采用瀑布流的形式加载大量网络图片 * 详细分析参见WaterfallScrollView * * 更新说明: * 在原本的的基础上添加了本地缓存DiskLruCache * * 所以在该示例中对于图片的缓存采用了:LruCache + DiskLruCache 的技术 * * 参考

利用LruCache加载网络图片实现图片瀑布流效果(改进版)

MainActivity如下: package cc.patience4; import cc.patience4.R; import android.os.Bundle; import android.app.Activity; /** * Demo描述: * 采用瀑布流的形式加载大量网络图片 * 详细分析参见WaterfallScrollView * * 更新说明: * 该示例在基础版的基础上加入了图片查看功能. * 点击瀑布流中一张图片后可欣赏图片并能对图片进行单指拖动和两指缩放. * 对