图片加载,压缩,缓存
Bitmap的高效加载
BitmapFactory提供了四类方法:decodeFile decodeStream decodeResource decodeByteArray;
分别送 文件系统 资源 输入流 字节数组中加载出一个bitmap对象;其中decodeFile decodeResource间接调用了decodeStream;
图片存储格式
存储方法我们知道ARGB指的是一种色彩模式,里面A代表Alpha,R表示red,G表示green,B表示blue.
其实所有的可见色都是右红绿蓝组成的,所以红绿蓝又称为三原色,每个原色都存储着所表示颜色的信息值
ALPHA_8就是Alpha由8位组成
ARGB_4444就是由4个4位组成即16位
ARGB_8888就是由4个8位组成即32位
RGB_565就是R为5位,G为6位,B为5位共16位
位图位数越高代表其可以存储的颜色信息越多,当然图像也就越逼真
高效加载bitmap核心思想就是采用BitmapFactory.Options来加载所需要的尺寸图片。通过bitmapFactory.Options可以按一定采样率来加载缩小后的图片 然后再显示在imageView中这样会降低内存占用从而从一定程度上避免OOM提供加载性能。
BitmapFactory.Options来缩放图片主要是通过它的inSampleSize参数即采样率 当inSampleSize为1时采样后的图片为原始图片大小;为2时为原始图片的二分之一,像素数为原始图的四分之一内存占用大小也为四分之一;inSampleSize的取值应该为2的指数 1 2 4 6 8 ;
如何获取采样率?
1 将BitmapFactory.Options的inJustDecodeBounds参数设置为true;
2 从bitmapFactory.Options中取出图片的原始宽高信息对应与outWidth和outHeight;
3 根据采样率规则并结合目标view计算出所需要的采样率inSampleSize;
4 将BitmapFactory.options的injustDecodeBounds参数设置为false 然后重新加载图片view;
进过这四个步骤加载出来的图片就是最终缩放后的图片
Android中的缓存策略;
缓存策略核心思想:程序第一次从网络加载图片后将其缓存在存储设备上这样下次使用图片时候就不用从网络中获取了为用户节省了流量;有时候为了提升用户体验还会吧图片在内存中缓存一份这样当app打算从网络中请求图片时候程序就会先从内存中获取如果没有就从存储设备中获取如果存储设备也没有再从网络加载;
同样这种思想也适合与其他文件;
缓存策略主要包含缓存的 添加 获取和 删除 三类操作;
为什么要删除缓存呢 因为内存的大小是有限的因此在使用缓存的是总要为缓存设置一个最大容量;
android中常用的缓存算法为LRU(Least Recently Used)
LRU有两种LruCache(内存缓存)和DiskLruCache(存储设备缓存);
LruCache是一个泛型类内部采用了一个LinkedHashMap以强引用的方式存储外界的缓存对象 是线程安全的;
提供了get和put方法来完成缓存的获取和添加操作;
强引用 直接的对象引用
软引用 当一个对象只有软引用时 系统内存不足时就会被GC回收掉;
弱引用 当一个对象只有弱引用时 可能随便会被Gc回收掉;
DiskLruCache不属于androidSDK的一部分
DiskLruCache的创建
不能通过构造方法创建而是提供了open 方法创建自身
open方法的四个参数(文件系统的路径,应用的版本号,单个节点对应的数据个数一般为一,缓存文件的总大小);
缓存的添加
添加操作 通过Editor完成
缓存的获取 通过get方法得到一个Snapshot对象 在通过这个对象就可得到缓存文件的输入流