Android中图片的三级缓存

来源:互联网 发布:java宠物商店项目代码 编辑:程序博客网 时间:2024/06/06 08:38

1.咱们先说说为什么要使用图片的三级缓存机制

移动端app显示的图片还是蛮多的,如应用商场商品的图片。如果不进行三级缓存机制的处理,对用户来说是一个很大的损失,现在数据流量还是蛮贵的。

2.什么是三级缓存机制

网络缓存:不优先加载,加载慢,费流量

本地缓存:次优先加载, 加载速度快

内存缓存:优先加载,加载的速度超快。

当访问网络的时候,首先要判断内存里是否有 这个缓存如果有就加载显示,如果没有就看本地缓存是否有该缓存,如果有加载显示,如果没有进行网络请求。

3.网络缓存简单就是进行网络请求,本地缓存就是就该链接的内容保存到本地,这里我们说的重点是内存缓存。

内存缓存注意的一个点就是防止内存溢出的问题。

为什么会造成内存溢出呢?? 因为手机系统为应用提供的内存是16M或24M,不过不同手机品牌的手机分配的内存大小不一样。

android系统加载图片的时候是解析图片的像素信息,然后将每一个像素信息保存到内存中。

图片大小=图片的总像素*每个像素点的大小

例如一张1920x1080的JPG图片,在Android 系统中是以ARGB格式解析的,即一个像素需占用4个字节,图片的大小=1920x1080x4=7M

实现方法:通过hashMap<string ,Bitmap> 键值对来保存图片,key为URL,bitmap为要保持的信息。强引用很容易造成内存的泄露。我们采用弱引用。

通过hashMap<String, SoftReference<Bitmap>>为引用对象,(垃圾回收器会自动回收软引用对象)但是从系统2.3以后系统会优先考虑回收弱引用的对象。所以我们要用

软引用对象,LruCache<String,Bitmap> 使用最少最近使用算法,会将内存控制在一定的大小,超出部分,采用最近最少使用算法进行回收。

/** * 三级缓存之内存缓存 */ public class MemoryCacheUtils
{ // private HashMap<String,Bitmap> mMemoryCache=new HashMap<>();//1.因为强引用,容易造成内存溢出,所以考虑使用下面弱引用的方法// private HashMap<String, SoftReference<Bitmap>> mMemoryCache = new HashMap<>();//2.因为在Android2.3+后,系统会优先考虑回收弱引用对象,官方提出使用LruCacheprivate LruCache<String,Bitmap> mMemoryCache; public MemoryCacheUtils(){long maxMemory = Runtime.getRuntime().maxMemory()/8;//得到手机最大允许内存的1/8,即超过指定内存,则开始回收//需要传入允许的内存最大值,虚拟机默认内存16M,真机不一定相同 mMemoryCache=new LruCache<String,Bitmap>((int) maxMemory){//用于计算每个条目的大小 @Overrideprotected int sizeOf(String key, Bitmap value){ int byteCount = value.getByteCount(); return byteCount; } }; } /** * 从内存中读图片 * @param url */ public BitmapgetBitmapFromMemory(String url){ //Bitmap bitmap = mMemoryCache.get(url);//1.强引用方法/*2.弱引用方法 SoftReference<Bitmap> bitmapSoftReference = mMemoryCache.get(url); if (bitmapSoftReference != null) { Bitmap bitmap = bitmapSoftReference.get(); return bitmap; } */ Bitmap bitmap = mMemoryCache.get(url);return bitmap; } /** * 往内存中写图片 *@param url * @param bitmap */public void setBitmapToMemory(String url, Bitmap bitmap){ //mMemoryCache.put(url, bitmap);//1.强引用方法/*2.弱引用方法 mMemoryCache.put(url, new SoftReference<>(bitmap)); */ mMemoryCache.put(url,bitmap); } }