Bitmap的高效加载
加载Bitmap : BitmapFactory decodeFile 、decodeResource、decodeStream、decodeByteArray
高效加载Bitmap的核心思想: 采用BitmapFactory.Options , 使用inSampleSize(采样率)参数来缩放图片;若为1则采样后的图片大小为图片的原始大小,当inSampleSize大于1时,x 则采样后的图片大小为原图的1/x;开发建议:inSampleSize应为2的指数(1,2,4,8,16)
流程
- 将BitmapFactory.Options的inJustDecodeBounds设置为true
- 从BitmapFactory.Options中获取图片的原始宽高(outWidth , outHeight)
- 根据采样率的规则并结合目标view所需的大小计算出采样率inSampleSize
- 将BitmapFactory.Options的inJustDecodeBounds设置为false,重新加载图片
Android中的缓存策略
缓存策略一般包含缓存的添加,获取和删除(删除的原因是缓存的大小有限制)
目前常用的一种缓存算法是LRU(Least Recently Used)即近期最少使用算法
核心思想:当缓存满时,会优先淘汰那些近期最少使用的缓存对象
实现: LruCache (内存缓存) , DiskLruCache(存储设备缓存)不仅仅只适用于Bitmap哦
- LruCache
是一个泛型类,内部采用一个LinkedHashMap以强引用的方式存储外界的缓存对象,提供get和put方法来完成缓存的获取和添加操作;
获取缓存对象: mMemoryCache.get(key)
添加缓存对象: mMemoryCache.put(key, bitmap) - DiskLruCache
注意:不属于Android SDK的一部分,但得到了Android官方文档的推荐
创建:
使用open方法创建自身
public static DiskLruCache open(File directory , int appVersion , int
valueCount, long maxSize)
directory : 存储路径
appVersion : 版本号(一般为1)版本号发生改变会清空之前所有的缓存文件
valueCount : 单个节点所对应的数据的个数,一般设为1
maxSize : 缓存的总大小
添加:
通过Editor完成
如果缓存图片需要把url进行特殊处理
DiskLruCache.Editor editor = mDiskLruCache.edit(key);
if (editor != null) {
OutputStream outputStream = editor.newOutputStream(0);
}
根据得到的outputStream在图片从网络下载的时候通过这个文件输出流写入文件系统,写入以后调用Editor的commit()
查找:
通过mDiskLruCache.get()得到DiskLruCache.Snapshot对象
通过snapshot的getInputStream()得到FileInputStream
列表优化
核心思想:不要在主线程做太耗时的操作
其他考虑: 控制异步任务的执行频率