ImagerLoader的原理

来源:互联网 发布:薪酬优化 密件工资单 编辑:程序博客网 时间:2024/05/01 20:10

Android Universal Image Loader 是一个强大的、可高度定制的图片缓存 。

简单的说 UIL 就做了一件事——获取图片并显示在相应的控件上。

这里写图片描述
整个库分为 ImageLoaderEngine, Cache 及 ImageDownloader , ImageDecoder , BitmapDisplayer , BitmapProcessor 五大模块,其中 Cache 分为 MemoryCache 和 DiskCache 两部分。
简单的讲就是 ImageLoader 收到加载及显示图片的任务,并将它交给 ImageLoaderEngine , ImageLoaderEngine 分发任务到具体线程池去执行,任务通过 Cache 及 ImageDownloader 获取图片,中间可能经过 BitmapProcessor 和 ImageDecoder 处理,最终转换为 Bitmap 交给 BitmapDisplayer 在 ImageAware 中显示。
注释:
mageLoaderEngine:任务分发器,负责分发 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 。
流程图:
这里写图片描述

1.UI请求数据,使用唯一的key值索引Memory Cache中的Bitmap
2.内存缓存:缓存搜索,如果能找到key值对应的Bitmap,则返回数据,否则执行第三步;
3.硬盘缓存:使用唯一的key值对应的文件名,检索SDCard上的文件
4.如果有对应文件,使用BitmapFactory.decode*方法,解码Bitmap并返回数据,同时将数据写入缓存,如果没有过对应文件,执行第五步.
5.下载图片:启动异步线程,从数据源下载数据
6.若下载成功,将数据同时写入硬盘和缓存.并将Bitmap显示在UI中;

0 0