ImagerLoader的原理
2016-06-21 10:14
369 查看
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中;
简单的说 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中;
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories