正文
关于基本用法想必很多朋友也知道了,或者直接看下Github说明里的使用方法,这里就不再赘述。
和源码见面之前,先和几个重要的类打招呼:
ImageLoaderEngine:
任务分发器,负责分发LoadAndDisplayImageTask和ProcessAndDisplayImageTask给具体的线程池去执行。
ImageAware:
显示图片的对象,可以是ImageView等。
ImageDownloader:
图片下载器,负责从图片的各个来源获取输入流。
Cache:
图片缓存,分为MemoryCache和DiskCache两部分。
MemoryCache:
内存图片缓存,可向内存缓存缓存图片或从内存缓存读取图片。
DiskCache:
本地图片缓存,可向本地磁盘缓存保存图片或从本地磁盘读取图片。
ImageDecoder:
图片解码器,负责将图片输入流InputStream转换为Bitmap对象。
BitmapProcessor:
图片处理器,负责从缓存读取或写入前对图片进行处理。
BitmapDisplayer:
将Bitmap对象显示在相应的控件ImageAware上。
LoadAndDisplayImageTask:
用于加载并显示图片的任务。
ProcessAndDisplayImageTask:
用于处理并显示图片的任务。
DisplayBitmapTask:
用于显示图片的任务。
其中有个全局图片加载配置类贯穿整个框架,
ImageLoaderConfiguration
,可以配置的东西实在有点多:
主要是图片最大尺寸、线程池、缓存、下载器、解码器等等。
经过前面那么多的铺垫,终于迎来了源码~~
整个框架的源码上万,全部讲完不可能,最好的方式还是按照加载流程走一遍,细枝末节各位可以自己慢慢研究,一旦整体把握好了,其他的一切就水到渠成,切勿只见树木不见森林,迷失在各种代码细节中~~
好了,简单点,讲代码的方式简单点,从最简单的代码切入:
imageLoader.displayImage(imageUri, imageView);
进入方法:
ImageAware 是 ImageView 的包装类,持有 ImageView对象 的弱引用,防止 ImageView 出现内存泄漏发生。主要是提供了获取 ImageView 宽度高度和 ScaleType 等。
最终会执行这一个重载方法:
这个方法基本描绘出了整个图片加载的流程,重要的地方已经加上注释。
if (listener ==
null
)
的 listener 就是上面基本使用说明复杂版本的进度回调接口 ImageLoadingListener,大家看下就知道,如果没有配置的话设置为默认,而默认其实啥都没做,方法都是空实现。
if (options ==
null