1 图片的加载通常会导致OOM异常:
处理:
1) 计算图片可能得压缩比例 (inSampleSize压缩比例)
2)将图片压缩
3 )计算应用程序可能得到的最大内存,实例化LruCache,并赋予适当的缓存空间
原理:把最近使用的对象用强引用存储在 LinkedHashMap 中,并且把最近最少使用的对象在缓存值达到预设定值之前从内存中移除
计算压缩比例:
1 计算加载图片的实际尺寸(inJustDecodebounds=true程序会解析图片的实际尺寸,因为不反会Bitmap所以不占用内存,false则会返回bitmap对象)
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) { // 第一次解析将inJustDecodeBounds设置为true,来获取图片大小 final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(res, resId, options); // 调用上面定义的方法计算inSampleSize值 options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); // 使用获取到的inSampleSize值再次解析图片 options.inJustDecodeBounds = false; return BitmapFactory.decodeResource(res, resId, options); }
2 实际尺寸和所需要的尺寸来计算压缩比例
public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { // 源图片的高度和宽度 final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { // 计算出实际宽高和目标宽高的比率 final int heightRatio = Math.round((float) height / (float) reqHeight); final int widthRatio = Math.round((float) width / (float) reqWidth); // 选择宽和高中最小的比率作为inSampleSize的值,这样可以保证最终图片的宽和高 // 一定都会大于等于目标的宽和高。 inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; } return inSampleSize; }
3 实例化缓存
// 获取应用程序最大可用内存 int maxMemory = (int) Runtime.getRuntime().maxMemory(); int cacheSize = maxMemory / 5; System.out.println("总缓存大小:;"+cacheSize ); // 设置图片缓存大小为程序最大可用内存的1/8 LruCache<String, Bitmap>= new LruCache<String, Bitmap>(cacheSize) { @Override protected int sizeOf(String key, Bitmap bitmap) { return bitmap.getByteCount(); } };
public void addBitmapToMemoryCache(String key, Bitmap bitmap) { if (getBitmapFromMemCache(key) == null) { mMemoryCache.put(key, bitmap); } } public Bitmap getBitmapFromMemCache(String key) { return mMemoryCache.get(key); }
附件中是Gallary加载网路图片的例子
参考:
http://blog.csdn.net/luohai859/article/details/38660467
http://blog.csdn.net/luohai859/article/details/38660257
相关推荐
案例包含Android-Universal-Image-Loader 网络图片加载框架实现图片加载和结合universal-image-loader与LruCache来自定义缓存图片,可以设置缓存与不缓存。 博客地址:...
实现网络图片加载在手机客户端,保存到内存-SD卡-网络,三步走从而实现减小流量消耗,让用户体验跟家流畅
但这一层相对于内存的读取速度会慢很多,所以,很好的协调这三层图片缓存就可以提升应用性能和用户体验。 秉着不重复造轮子原则,这里我采用Volley LruCache DiskLruCache三个谷歌官方认可的库来实现网络图片三级...
SuperImageEngine这是一个用lrucache实现的带有双缓存功能,从网络下载图片并显示给listView的工具并且用jni实现了三个native方法 通过该方法可以设置检测多久未使用的图片进行删除 这个项目简单 具体的请看代码
这是一款图片缓存工具类源码,该项目实现了ImageCache,图片缓存工具类可直接用于项目,主要实现了通过图片的URL在线请求图片展示、使用LruCache和DiskCache 进行缓存到本地,完美的解决了加载图片过多的情况下会抛出...
ImageManager2这个类具有异步从网络下载图片,从sd读取本地图片,内存缓存,硬盘缓存,图片使用动画渐现等功能,已经将其应用在包含大量...我这里的解决方案是HandlerThread(异步加载)+LruCache(内存缓存)+DiskLruCach
安卓图片三级缓存实现代码,LruCache,DiskLruCache,Volley
通过LruCache类,实现Android图片的三级缓存。
图片下载采用 Volley, 图片缓存为 LruCache DiskLruCache 的双重缓存 使用 largeHeap 避免加载大量图片的帖子时出现 OOM 使用 Jsoup分析返回的网络请求 缓存了论坛列表和帖子列表, 如果内存有历史记录就从历史记录...
这是一款图片缓存工具类源码,该项目实现了ImageCache,图片缓存工具类可直接用于项目,主要实现了通过图片的URL在线请求图片展示、使用LruCache和DiskCache 进行缓存到本地,完美的解决了加载图片过多的情况下会抛出...
简单实现Android开发中图片的三级缓存,避免OOM
图片墙,有效的避免了OOM,利用LruCache的缓存技术
1. **异步加载**:利用Android的AsyncTask或Handler机制,实现图片的异步加载,避免阻塞UI线程,保证应用的流畅性。 2. **仅加载当前页图片**:通过监听Gallery的滚动事件,仅在用户停止滚动时加载当前页面的图片,...
前言: ...我们得知一个应用如果使用大量图片就会导致OOM(out of memory),那该如何处理才能近可能的降低oom发生的概率呢?之前我们一直在使用...然后学习一下基于Lru的Lrucache、DiskLruCache 实现我们的图片
应用LruCache+AsyncTask实现图片加载与缓存,但会有图片错位以及图片变更现象,因此此代码仅供暴露问题
Android 图片的三级缓存...很好的协调这三层图片缓存就可以大幅度提升应用的性能和用户体验。 快速实现三级缓存的工具类ImageCacheUtil如下(有更好的建议可以发我的邮箱说出你的想法,一起完善,邮箱见博客主页“给我
该项目采用MVP架构实现了用户登录、注册,把用户信息存放在服务器上,便于实现数据的同步;商品的推荐、浏览,改写上拉刷新下拉...为了提高用户体验,对商品图片采用LruCache进行缓存处理,提高了ListView的加载速度。
基于android的网上商城采用MVP架构实现了用户登录、注册,把用户信息存放在服务器上,便于实现数据的同步;...为了提高用户体验,对商品图片采用LruCache进行缓存处理,提高了ListView的加载速度。