最近在研究ImageLoader的源码,希望能分享出自己的思路。具体源码移步Github下载:https://github.com/nostra13/Android-Universal-Image-Loader
我们先不急着对源码进行讲解,如果有什么失误请大家留言探讨,我们先来了解一下ImageLoader的相关类依赖简略结构图:
从图中我们可以分为三层:
1:UI层。
2:加载展示逻辑层:各种配置、LoadTask、DisplayTask。
3 :获取图片数据层。
下面我们来介绍一下ImageLoader中的类:
入口控制类:
ImageLoader:入口类,作为整个框架的入口控制类,使用的是单列模式。
配置类
ImageLoaderConfiguration:提出ImageLoader的配置。使用的是建造者模式。
DefaultConfigurationFactory:ImageLoaderConfiguration的默认配置工厂类。使用静态的工厂模式。
DisplayImageOptions:包含一些图片展示的选项:比如图片加载失败、加载中、异常展示的图片。建造者模式。
ImageLoadingInfo:图片加载中的信息类。封装一些key、展示View、DisplayImageOptions、图片加载监听器和过程监听器等。
任务类:
ImageLoaderEngine:所有需要异步加载线程池执行线程的曹组都通过该类完成。
DisplayBitmapTask:通过执行这个任务显示加载好的Bitmap图片。
ProcessAndDisplayImageTask:内存换成获取到Bitmap的情况下,需要后处理器处理的时候调用的任务。即为:options.shouldPostProcess()成立时调用。
LoadAndDisplayImageTask:加载图片流和展示调用的Task.
以下类按照包路径分批:
com.nostra13.universalimageloader.core.download(下载器模块):
ImageDownloader:图片下载器定义的接口,并定义好枚举类型和返回InputStream的方法。通过这个方法我们知道,ImageLoader框架支持:HTTP("http")、HTTPS("https")、FILE("file"), CONTENT("content")、ASSETS("assets")、DRAWABLE("drawable"),六种协议。
BaseImageDownloader:实现了ImageDownloader完成了各种协议获取InputStream的实现。
com.nostra13.universalimageloader.core.decode(图片流的解码器模块):
ImageDecodingInfo:解码图片流过程中用到的数据。
ImageDecoder:定义图片解码流的接口。通过传入的ImageDecodingInfo把流转换成Bitmap.
BaseImageDecoder:ImageDecoder的实现类。
com.nostra13.universalimageloader.core.imageaware(包装类)
ImageAware:包装展示类,比如ImageView的接口,扩展一些方法。定义获取宽高、获取ViewScaleType类型、获取封装对象 getWrappedView,是否回收isCollected、获取IDgetId、setImageDrawable、setImageBitmap。
ViewAware:实现ImageAware接口的抽象类。使用弱引用包装一个Android的View。
NonViewAware:实现ImageAware接口的抽象类,定义不需要依赖View展示的方法。这个一般方法使用只下载图片的情况下。
ImageViewAware:实现ViewAware抽象方法。重现一个ImageView特有的操作。
com.nostra13.universalimageloader.core.listener(监听器)
ImageLoadingListener:图片正在加载的监听器,定义开始、失败、完成、取消的放。
ImageLoadingProgressListener:图片加载进度监听器,定义onProgressUpdate方法。
SimpleImageLoadingListener:实现空的ImageLoadingListener方法。
PauseOnScrollListener:监听快速滚动的时候暂时加载。
com.nostra13.universalimageloader.core.assist(帮助类)
ViewScaleType:View缩放类型。
QueueProcessingType:任务处理类型。先进先出还是后进先出。
LoadedFrom:加载类型。网络、本地、内存。
ImageSize:图片大小。
ImageScaleType:图片缩放的类型。
FlushedInputStream:解决慢网络的流问题。
FailReason:失败原因。
ContentLengthInputStream:封装返回流。
com.nostra13.universalimageloader.core.assist.deque:队列。
下面我们来说一下核心的本地缓存和内存缓存的分类算法:
com.nostra13.universalimageloader.cache.memory(内存缓存)
MemoryCache:定义内存缓存方法的接口。
BaseMemoryCache:基本行为的抽象类。实现简单的设置、获取、删除、清理内存对象和获取所有keys的方法。暴露引用的抽象类。
LimitedMemoryCache:限制内存大小的抽象类。
WeakMemoryCache:实现BaseMemoryCache抽象类使用软引用策略。
FuzzyKeyMemoryCache:实现BaseMemoryCache,如果设置key之前遍历,如果cache存在,就先删除再设置。
UsingFreqLimitedMemoryCache:实现LimitedMemoryCache,记录使用次数,如果超过限制的大小,就删除使用最少的。
FIFOLimitedMemoryCache:实现LimitedMemoryCache,使用先进先出算法,用列表保存Bitmap列表,删除时删除0的先。
LargestLimitedMemoryCache:实现LimitedMemoryCache,记录位图的大小,超出删除最大的位图。
LRULimitedMemoryCache:实现LimitedMemoryCache,最近最少使用算法。使用LinkedHashMap的特性,找出最长时间没有使用的Bitmap并删除,弱引用。
LruMemoryCache:实现MemoryCache,最近最少使用算法。强引用。
com.nostra13.universalimageloader.cache.disc(硬盘缓存)
DiskCache:定义缓存的接口
com.nostra13.universalimageloader.cache.disc.naming(文件名生成器)
FileNameGenerator:定义接口
HashCodeFileNameGenerator:用URL生成hashcode码转字符串。
Md5FileNameGenerator:用MD5加载URL生成唯一key.
com.nostra13.universalimageloader.cache.disc.impl(硬盘缓存实现):
BaseDiskCache:抽象类。
UnlimitedDiskCache:实现BaseDiskCache,不错任何限制。
LimitedAgeDiskCache:实现BaseDiskCache,超时删除。
LruDiskCache:最近最少使用算法实现硬盘缓存。