(十六)Bitmap的加载和Cache

来源:互联网 发布:软件风险分析 编辑:程序博客网 时间:2024/05/18 01:12
Bitmap的高效加载

Bitmap.Config ARGB_4444:每个像素占四位,即A=4,R=4,G=4,B=4,那么一个像素点占4+4+4+4=16位 

Bitmap.Config ARGB_8888:每个像素占四位,即A=8,R=8,G=8,B=8,那么一个像素点占8+8+8+8=32位

Bitmap.Config RGB_565:每个像素占四位,即R=5,G=6,B=5,没有透明度,那么一个像素点占5+6+5=16位

Bitmap.Config ALPHA_8:每个像素占四位,只有透明度,没有颜色。

一般情况下我们都是使用的ARGB_8888,由此可知它是最占内存的,因为一个像素占32位,8位=1字节,所以一个像素占4字节的内存。假设有一张480x800的图片,如果格式为ARGB_8888,那么将会占用1500KB的内存


bitmap在android中指的是一张图片。BitmapFactory类提供了四类方法:decodeFile、decodeResource、decodeStream和decodeByteArray。分别用于支持从文件系统、资源、输入流和字节数组中加载出一个Bitmap对象,其中decodeFile和decodeResource又间接调用了decodeStream方法。
如何高效加载Bitmap呢,核心思想就是采用BitmapFactory.Options来加载所需尺寸图片。
通过BitmapFactory.Options来缩放图片,主要是用到他的inSampleSize参数,即采样率。当inSampleSize为1时,采样后的图片为原始大小,当inSampleSize大于1时,比如2,则采样后的图片宽高为原图的1/2,像素为原图的四分之一,(长宽各为二分之一,相乘为四分之一)。当inSampleSize小于1时,其作用相当于1.inSampleSize一般为2的指数,如:1、2、4、8。。。
获取采样率的步骤:
1.将BitmapFactory.Options的inJustDecodeBounds参数设置为true并加载图片
2.从BitmapFactory.Options中取出图片原始信息,他们对应于outWidth和outHeight参数。
3.根据采样率的规则并结合目标View所需大小计算出采样率inSampleSize
4.将inJustDecodeBounds参数设置为false。
代码实现:



Android中的缓存策略
通常使用的一种算法是LRU(least recently used),近期最少使用算法。核心思想是当缓存满时,会率先淘汰那些近期最少使用的缓存对象。分为两种:LruCache和DiskLruCache。
LruCache
LruCache是android 3.1提供的缓存类,通过v4包可以兼容到之前版本,一般使用v4包中的LruCache类。
LruCache是一个泛型类,内部采用一个LinkedHashMap以强引用的方式存储外界的缓存对象,提供了set和get方法来完成缓存的添加和获取操作。是线程安全的。
软引用:当一个对象只有软引用存在时,系统内存不足时此对象会被回收
强引用:直接的对象引用
弱引用:当一个对象只有弱引用存在时,此对象会随时被gc回收。


DisLruCache
用于实现存储设备缓存,即磁盘缓存。通过将缓存对象写入文件系统而实现缓存效果。
1.DisLruCache的创建
不能通过构造方法创建,它提供open方法来创建自身。


2.DisLruCache的缓存添加
缓存添加的过程是通过Editor完成的,Editor表示一个缓存对象的编辑对象。值得注意的一点是,此处要将图片的url转化成key(一般用MD5值作为key),以防url中含有特殊字符,影响使用。


3.DisLruCache的缓存查找
与添加过程类似,将url转成key,然后通过get方法得到一个Snapshot对象,在通过Snapshot对象得到缓存的文件输入流。

ImageLoader的实现
1.压缩图片功能实现
2.内存缓存和磁盘缓存的实现,在ImageLoader初始化时会创建LruCache和DiskLruCache。
3.同步加载和异步加载接口的设计
原创粉丝点击