Android中图片的三级缓存

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+后,系统会优先考虑回收弱引用对象,官方提出使用LruCache private LruCache<String,Bitmap> mMemoryCache; public MemoryCacheUtils(){ long maxMemory = Runtime.getRuntime().maxMemory()/ 8; //得到手机最大允许内存的1/8,即超过指定内存,则开始回收 //需要传入允许的内存最大值,虚拟机默认内存16M,真机不一定相同 mMemoryCache= new LruCache<String,Bitmap>(( int) maxMemory){ //用于计算每个条目的大小 @Override protected int sizeOf(String key, Bitmap value) { int byteCount = value.getByteCount(); return byteCount; } }; } /** * 从内存中读图片 * @param url */ public Bitmap getBitmapFromMemory(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); } }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值