Android UIL图片加载框架学习

单张图片加载模型


Android UIL图片加载框架学习_第1张图片
单张图片加载模型

图片加载步骤:

  • 根据uri 定位到文件,本地磁盘文件,Assert 文件,res 资源文件,network 网络文件等;
  • 从图片文件中获取流数据到内存,这个过程可以叫做load;
  • 对流数据进行解码,得到原始图像数据Bitmap,这个过程叫做解码,decode ;
  • 将bitmap设置给view 显示出来,这个过程叫display ;

注意事项:

  • 图片解码过程中,单张图片解码出来的图片数据会达到很大,甚至导致应用出现oom的情况,需要谨慎对待;
  • 图片显示过程中,View 的大小相对来说都是比较固定的,一张很大的图片显示在一个比较小的view 上面,显示效果不但得不到提升,而且还会消耗系统资源;

多张图片的缓存模型


Android UIL图片加载框架学习_第2张图片
多张图片加载的缓存模型

场景:

  • 在界面的切换过程中,很多图片资源是共用的,我们的每一次图片显示都经过load,decode,display?
  • 一张网络图片,上次从服务器下载下来了,下次用到的时候,还需要从服务器download,然后load,decode,display?

解决方案:

  • 对于已经显示过得图片,将它存在内存中,下次再用的时候直接从内存中拿取;不用走整个的图片加载流程;
  • 对于已经下载过得网络图片,保存在本地磁盘,再次加载的时候直接从磁盘读取,同时缓存到内存中,就不用再次从服务器下载了;

注意事项:

  • 图片缓存在内存中,内存的大小始终是有限的,需要控制总的内存占用;
  • 图片缓存到磁盘,磁盘的空间是有限的,需要有效的控制磁盘占用;

UIL 框架源码结构

———

Android UIL图片加载框架学习_第3张图片
UIL代码结构

流程控制:
ImageLoader 入口类;
ImageLoaderEngine 提供线程池;
XXXXXTask ,Runnable 接口实现类,具体的流程控制类,会被丢到线程池中执行 ;

具体的实现:
downloader 目录: 文件加载,从网络,本地,res ,assert 加载图片数据到内存中;
decode 目录:对加载进来的流数据进行解码,得到Bitmap 数据 ;
display 目录:对需要显示的bitmap数据进行处理,比如显示倒影,圆角等;
imageaware 目录: bitmap显示封装类,提供统一的图片数据显示方式;
listener 目录:图片加载过程的回调接口,通知流程进度和事件;
memory 目录:内存缓存模型,提供各种策略的缓存方式;
disc 目录:磁盘缓存模型,提供各种磁盘缓存方式;

类结构与加载模型对应关系


Android UIL图片加载框架学习_第4张图片
Paste_Image.png

类与流程

UIL 流程控制:ImageLoader 中生成Task ,提交到ImageLoaderEngine 中的线程池中执行;
具体的执行过程:downloader -> disc ->decode ->memory->display->imageaware ;

UIL类和流程.png

你可能感兴趣的:(Android UIL图片加载框架学习)