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功能强大是毋庸置疑的,代码框架也很清晰,文档也算齐全~ 但是对开发者尤其是我这样的初学者来说一点点啃下来还是很艰难的,最好先看教程一二,完全懂了以后再看本篇,当然一二看懂基本上图片处理也差不多了

本篇相当于对之前教程做个验证 "你看,最有名的框架基本上也是这么处理嘛~"如此这般从侧面证实一下教程中方法的靠谱性~

其他作用呢? 通过钻研肯定是提高我们的技术了,学习别人的类结构设计~ 也能更好的使用图片框架(其他框架差不多都这样逻辑),且对于拓展部分也可以作为自己的亮点在面试中使用 ~

转载于:https://www.cnblogs.com/kuaileyuyi/p/3851753.html

Android Bitmap 开源图片框架分析(精华四)相关推荐

  1. Android第三方开源图片裁剪截取:cropper

     Android第三方开源图片裁剪截取:cropper 很多app都需要裁剪截取图片作为头像.logo之类,而cropper是github上的一个针对Android平台的.第三方开源图片裁剪截取项 ...

  2. Android A/B System OTA分析(四)系统的启动和升级

    Android从7.0开始引入新的OTA升级方式,A/B System Updates,这里将其叫做A/B系统,涉及的内容较多,分多篇对A/B系统的各个方面进行分析.本文为第四篇,系统的启动和升级. ...

  3. android bitmap转图片_这是一份面向Android开发者的复习指南

    来自:简书,作者:九心 链接:https://www.jianshu.com/p/b3c1b9c6dd40 前言 相信很多同学都会有这样的感受,前三天刚刚复习的知识点,今天问的时候怎么就讲不出个所以然 ...

  4. android bitmap转图片_Android 这些 Drawable 你都会用吗?

    在实际开发的过程中,除了广为人知的利用 StateListDrawable 设置按钮点击特效,我们有时可能会接到一些这样的需求,比如要求我们的头像显示成圆形或者圆角矩形,甚至要加上可变颜色的边框,或者 ...

  5. Android 8.0 RIL框架分析

    原文地址:https://blog.csdn.net/qq_27540925/article/details/79356799 前言 Android O的版本对RIL的框架的通信功能进行了改动,不在使 ...

  6. android主流开源自动化框架(monkeyrunner,robotium,uiautomator

    2019独角兽企业重金招聘Python工程师标准>>> android自动化框架: Uiautomator: 优点:可以对所有操作进行自动化,操作简单:缺点:Android版本需要高 ...

  7. Android最火的框架系列(四)Volley

    其实,本来不想写Volley的,由于前面写了一篇如何使用Eclipse搭建Android服务端的博客,今天,我们尝试用Volley去访问一下.其实,Volley已经不算是很火的网络请求框架了,Voll ...

  8. android bitmap转图片_带你用Android自定义View实现网易云音乐宇宙尘埃特效

    作者:Mlx, 链接:https://juejin.im/post/6871049441546567688 前言 前段时间,女朋友用网易云音乐的时候看到一个宇宙尘埃特效,说很好看,想要让我给她开VIP ...

  9. android bitmap显示图片,Android_07 Android中Bitmap加载图片

    一:计算机表示图形的几种方式 二:Android加载大图片 原理: [1]获取手机分辨率 [2]获取图片分辨率 创建位图工厂的配置参数 获取图片宽高 [3]计算缩放比例 [4]显示缩放后的图片 示例代 ...

  10. android动态分区AB升级,Android A/B System OTA分析(四)系统的启动和升级

    Android从7.0开始引入新的OTA升级方式,A/B System Updates,这里将其叫做A/B系统,涉及的内容较多,分多篇对A/B系统的各个方面进行分析.本文为第四篇,系统的启动和升级. ...

最新文章

  1. 昌宁一中高考成绩表查询2021,昌宁县一中20182019学年上学期高二数学月考试题含解析.docx...
  2. [Asp.net MVC]Asp.net MVC5系列——第一个项目
  3. 冒泡和快速排序的时间复杂度_排序算法整合(冒泡,快速,希尔,拓扑,归并)
  4. 疯狂吸金1600个亿的拼多多,社交网络分析到底隐藏多少财富?
  5. mysql中筛选条件分类
  6. ios定位权限plist_iOS-info.plist 中添加定位权限
  7. ML《集成学习(二)Boosting之Adaboosting》
  8. 来自百度的71款开源项目
  9. JDBC 笔记4 PreparedStatement 与Statement 的区别
  10. Web.config常用节点解析:
  11. C++关闭同步流 ios::sync_with_stdio(false);
  12. Unity之粒子特效参数详解
  13. 使用wps的邮件合并和文档附件制作以照片形式的准考证
  14. 【LeetCode - 248】中心对称数 III
  15. python金融大数据分析师工资待遇_请问数据分析师这个工作怎么样,是否值得成为努力方向?...
  16. 双alpha可以结合吗_评测揭秘双音腔HyperX Cloud Alpha耳机
  17. python乱码系列1
  18. 前端必学——用JavaScript实现电商图片放大镜效果(附代码)
  19. 一边攒大米,一边做公益
  20. 传统企业上云的三个正确姿势是什么?

热门文章

  1. python基础自动化测试_Python自动化测试基础之HelloWorld
  2. nc 发布元数据_智联科发布新一代连续式NC膜粘膜划膜一体机
  3. 阿里巴巴大数据运维平台实践
  4. 电商网站商品图片放大镜实现
  5. java多线程都有几种方式实现
  6. NeHe OpenGL第四十四课:3D光晕
  7. Chrome 清除当前网站下的缓存
  8. 【Linux命令】Linux下的tar压缩解压缩命令详解(转)
  9. iphone微信 h5页音乐自动播放
  10. 【python基础】--常用数据结构