disk缓存
主要难点在于内存缓存,disk缓存其实比较简单,就是图片加载完成后把图片文件存到本地方便下次使用
同样,先贴一下官方主页的介绍(主页地址见文章最开始处)
和内存缓存差不多,根据算法不同提供了几种类别,可以自行通过ImageLoaderConfiguration.discCache(..)设置
<ignore_js_op>
硬盘缓存,保存是以文件的形式
框架提供了4种类型,具体算法规则不同,看名字我们大概也能知道对应意思
UnlimitedDiscCache 不限制缓存池大小,最快的一种disk缓存,默认硬盘缓存方式(比其他disk缓存方式快30%)
TotalSizeLimitedDiscCache 限制缓存池总size大小,超出时删除最早保存的图片缓存文件
FileCountLimitedDiscCache 限制缓存池总数量,超出时删除最早保存的图片缓存文件,缓存图片是相同大小时使用此disk缓存类型
LimitedAgeDiscCache 不限制缓存池的大小,只对文件保存时间做限制,如果图片文件超出定义时间时删除之
同样,具体算法不做讨论~
图片缓存文件位置是优先保存在内存卡下的Android\data\应用包名\cache文件夹下的
(无权限,没有装sd等无法保存至sd卡的情况时,则保存在手机内存data\data\应用包名\cache文件夹下)
下图可以看到,文件缓存的保存位置是区分应用的,每个应用设置一个缓存文件夹,图片文件的名字也经过了md5编码处理
<ignore_js_op>
--------------------------------------------------------------------------------------------------------
图片加载一些具体数值的设置
比较重要的比如限定图片宽高多少合适啊~缓存池大小限定多少啊等等~
UIL框架中是在基本配置对象中进行设置的,前面提到过,有一个默认设置ImageLoaderConfiguration.createDefault(this);
针对绝大部分情况都适用的,要修改一些常用的配置的话, 设置方法可以去github UIL主页下载(文章开头有地址,文章结尾处我也会加上附件的)压缩包,里面包括源代码以及示例代码,可以在示例demo中查看一些常用基本配置设置和显示配置的设置
这里只介绍几个重要的值设定
图像压缩后的限定宽高值
<ignore_js_op>
不同的限定值设定,是有一个优先级的~ 我专门实验研究了下(actual measured width and height不是太清楚)
优先级 memoryCacheExtraOpstion > width/height > maxWidth/maxHeight > divice screen
即由高到低依次遍历是否能获取到值,获得后作为限定宽高值解析压缩后的图片实例对象
缓存池大小的设置~
分强引用和弱引用,弱引用我们知道不用限制~主要是针对强引用部分缓存池的限制
教程(二)里面也提到过,主要分两种:限制图片总数量 和 限制全部图片所占内存大小
对于强引用大小的限定,我们看下UIL框架的默认处理
[mw_shl_code=java,true]/**
* Creates default implementation of {@link MemoryCache} - {@link LruMemoryCache}<br />
* Default cache size = 1/8 of available app memory.
*/
public static MemoryCache createMemoryCache (int memoryCacheSize) {
if (memoryCacheSize == 0) {
memoryCacheSize = ( int) (Runtime. getRuntime().maxMemory() / 8);
}
return new LruMemoryCache(memoryCacheSize);
}[/mw_shl_code]
获取程序可用内存的1/8作为缓存池大小,也是推荐设置,有需要可以调用上面的方法传入>0的自定义size值即可设置
限制图片总数量,恕我眼神拙计= = 源码中没找到默认设置,毕竟设置内存大小更合适点
如果自己项目中有特殊需要,可以参考教程(二)中的相关部分进行设置
此外还有disk缓存池,由于默认是无限制disk缓存类型,没有一些具体参数数值的设定了~
还有图片下载线程数量问题,disk图片取名问题等等,不是核心部分~这里篇幅有限就不介绍了
--------------------------------------------------------------------------------------------------------
以上,核心代码分析结束~都弄懂了的话,图片的处理已经算是小有所成了,好处嘛~
一方面在使用框架的时候你可以更了解内部的机制,适当时候可以根据项目具体需要做相关继承重写进行修改(最好不要直接修改开源框架源码,保证其完整性)
另一方面更可以当作自己的一个优势点亮点,尤其在面试时多发挥发挥~比如介绍自己项目时,大部分网络数据交互的项目一般都是会有列表多图加载的情况的,你就可以就图片加载部分大谈特谈了~不过聊框架部分有风险,对于此方面知识匮乏的面试官来说, 有时候不明也不一定会觉历,会白白浪费口水~最好结合项目一边演示一边谈,具体技巧这里就不班门弄斧了,可以网上找些帖子看
下面的内容同样是选择性观看
包括UIL框架的一些扩展功能,以及源码的结
--------------------------------------------------------------------------------------------------------
UIL框架在核心的图片缓存技术,图片压缩,异步线程下载图片的传统框架功能以外~
还做了一些其他的
拓展功能
自定义ImageView控件,叫做ImageAware,支持圆角效果等功能
disk保存图片文件名md5编码
图片加载的显示效果,比如淡入的fade效果等等
(此外还有一些扩展的功能,由于是非核心部分不做详细介绍了)
此外还提供Widget~ 这个我就没研究了
源码结构
主要分三大包~下面挨个介绍
UIL的缓存池部分包/类结构
见下图,很清楚的结构,cache缓存包下分成两个部分,disc(disk缓存)包和memory(内存缓存)包
绿色部分是基类父类~ impl是具体实现子类,比如memory的impl包下的那8个,就是我们之前介绍的可以直接使用的不同缓存池类型,项目中有特殊需求的话,也可以自定义一个类继承重写做对应的修改
disk同理,基类+具体实现类,在此基础上多了个naming命名包,是对图片保存文件名称进行md5编码解码处理的
<ignore_js_op>
核心包
其中着重研究红框部分
图片解析包decode
基本配置类ImageLoaderCofiguration
显示配置类DisplayImageOptions
和最重要的图片加载器类ImageLoder
其他部分
assist为助手包,里面大部分都是一些Enum枚举类,比如前面提到的图片缩放类型,图片压缩类型等
display图片显示包,框架提供圆角矩形的图片显示效果,以及加载图片时fade效果(从透明到实体慢慢浮现的感觉)等
download图片下载包,篇幅有限此功能这里不做分析
imageaware自定义图片控件包,提供圆角的效果等
listener监听包,图片开始加载,正在加载,加载完毕等监听
process进程包,可以继承里面的接口自行定义图片加载过程中的效果
其他的还有一些线程啊,默认配置文件生成类啊等等的,同样篇幅有限不做分析
<ignore_js_op>
工具包
提供一些所需功能,比如IO流处理,disk缓存的路径处理等
其中最重要的是红框所示的图片size工具类,比如前面提到的computeImageSampleSize计算缩放比例就是在这个类里
<ignore_js_op>
--------------------------------------------------------------------------------------------------------
完
写了大概将近一周,修改时间占了一大半,反反复复的改,也是因为个人技术有限,部分姿势也是边研究边写的,可能有不太详细或者错误的地方再次希望大家提出来,多多指正或者共同探讨一下,也希望大家能收藏一下,我之后也会继续润色或补充文章不足地方的
UIL功能强大是毋庸置疑的,代码框架也很清晰,文档也算齐全~ 但是对开发者尤其是我这样的初学者来说一点点啃下来还是很艰难的,最好先看教程一二,完全懂了以后再看本篇,当然一二看懂基本上图片处理也差不多了
本篇相当于对之前教程做个验证 "你看,最有名的框架基本上也是这么处理嘛~"如此这般从侧面证实一下教程中方法的靠谱性~
其他作用呢? 通过钻研肯定是提高我们的技术了,学习别人的类结构设计~ 也能更好的使用图片框架(其他框架差不多都这样逻辑),且对于拓展部分也可以作为自己的亮点在面试中使用 ~
Android Bitmap 开源图片框架分析(精华四),布布扣,bubuko.com