1. 功能介绍
1.1 Android Universal Image Loader
Android Universal Image Loader 是一个强大的、可高度定制的图片缓存,本文简称为UIL
。
简单的说 UIL 就做了一件事——获取图片并显示在相应的控件上。
1.2 基本使用
1.2.1 初始化
添加完依赖后在Application
或Activity
中初始化ImageLoader
,如下:
public class YourApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(this)
// 添加你的配置需求
.build();
ImageLoader.getInstance().init(configuration);
}
}
其中 configuration 表示ImageLoader
的配置信息,可包括图片最大尺寸、线程池、缓存、下载器、解码器等等。
1.2.2 Manifest 配置
<manifest>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:name=".YourApplication"
…… >
……
</application>
</manifest>
添加网络权限。如果允许磁盘缓存,需要添加写外设的权限。
1.2.3 下载显示图片
下载图片,解析为 Bitmap 并在 ImageView 中显示。
imageLoader.displayImage(imageUri, imageView);
下载图片,解析为 Bitmap 传递给回调接口。
imageLoader.loadImage(imageUri, new SimpleImageLoadingListener() {
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
// 图片处理
}
});
以上是简单使用,更复杂 API 见本文详细设计
。
1.3 特点
- 可配置度高。支持任务线程池、下载器、解码器、内存及磁盘缓存、显示选项等等的配置。
- 包含内存缓存和磁盘缓存两级缓存。
- 支持多线程,支持异步和同步加载。
- 支持多种缓存算法、下载进度监听、ListView 图片错乱解决等。
2. 总体设计
2.1. 总体设计图
上面是 UIL 的总体设计图。整个库分为ImageLoaderEngine
,Cache
及ImageDownloader
,ImageDecoder
,BitmapDisplayer
,BitmapProcessor
五大模块,其中Cache
分为MemoryCache
和DiskCache
两部分。
简单的讲就是ImageLoader
收到加载及显示图片的任务,并将它交给ImageLoaderEngine
,ImageLoaderEngine
分发任务到具体线程池去执行,任务通过Cache
及ImageDownloader
获取图片,中间可能经过BitmapProcessor
和ImageDecoder
处理,最终转换为Bitmap
交给BitmapDisplayer
在ImageAware
中显示。
2.2. UIL 中的概念
简单介绍一些概念,在4. 详细设计
中会仔细介绍。
ImageLoaderEngine:任务分发器,负责分发LoadAndDisplayImageTask
和ProcessAndDisplayImageTask
给具体的线程池去执行,本文中也称其为engine
,具体参考4.2.6 ImageLoaderEngine.java
。
ImageAware:显示图片的对象,可以是ImageView
等,具体参考4.2.9 ImageAware.java
。
ImageDownloader:图片下载器,负责从图片的各个来源获取输入流, 具体参考4.2.22 ImageDownloader.java
。
Cache:图片缓存,分为MemoryCache
和DiskCache
两部分。
MemoryCache:内存图片缓存,可向内存缓存缓存图片或从内存缓存读取图片,具体参考4.2.24 MemoryCache.java
。
DiskCache:本地图片缓存,可向本地磁盘缓存保存图片或从本地磁盘读取图片,具体参考4.2.38 DiskCache.java
。
ImageDecoder:图片解码器,负责将图片输入流InputStream
转换为Bitmap
对象, 具体参考4.2.53 ImageDecoder.java
。
BitmapProcessor:图片处理器,负责从缓存读取或写入前对图片进行处理。具体参考4.2.61 BitmapProcessor.java
。
BitmapDisplayer:将Bitmap
对象显示在相应的控件ImageAware
上, 具体参考4.2.56 BitmapDisplayer.java
。
LoadAndDisplayImageTask:用于加载并显示图片的任务, 具体参考4.2.20 LoadAndDisplayImageTask.java
。
ProcessAndDisplayImageTask:用于处理并显示图片的任务, 具体参考4.2.19 ProcessAndDisplayImageTask.java
。
DisplayBitmapTask:用于显示图片的任务, 具体参考4.2.18 DisplayBitmapTask.java
。
3. 流程图
上图为图片加载及显示流程图,在 uil 库中给出,这里用中文重新画出。