一、 本文由来:
让更多的人审核和发现BUG,一直是本人所崇尚的目标。经历了5年的发展,Android中也有很多质量很高的开源项目。UnversalImageLoader(统一图片缓存加载库),目前最流行功能最强大的图片缓存库。本文致力于在学习中挖掘和探讨其代码和设计,或者说这是介绍怎样建设一个受欢迎的库。
项目地址:https://github.com/nostra13/Android-Universal-Image-Loader
二、功能以及设计:
良好的接口,丰富的核心,强大的扩展。
Imageloader对外接口使用了java工具类非常常见的单例模式,获取单例对象之后,调用displayImage方法就可以对一个已存在的ImageView加载一个远程URL图片
不难发现这也是门面模式一个很好的应用,将逻辑和控制置于ImageloaderEngine中,自己保存了配置对象ImageLoaderConfiguration。
类关系如下:
在使用Imageloader去显示图片之前,必须先调用初始化方法init(),传入一个配置对象.初始化代码示例:
这又是熟悉的建造者模式。Imageloader的配置和默认显示的配置都是通过Builder模式构建起来。通过研究内部实现可以发现,没有设置的选项,都会使用库本身默认的配置。
ImageloaderEngine类是库的核心,负责调度各个模块,这又是一个中介者模式。
ImageloaderEngine类中聚合了Task对象,LoadAndDisplay与ProgressAndDisplay的任务,根据名字就可以知道其功能。类关系如下:
ProgressAndDisplayTask相比LoadAndDisplay多了一个显示加载中图片的功能,只是在LoadAndDisplay之前多做了一步设置加载中图片的操作。
以下是LoadandDisplayTask的类关系视图:
如图,LoadAndDisplayTask类根据配置,调用ImageDownloader和ImageDecoder进行图片的下载和解码,最后通过DisplayImageOptions中的bitmapDisplayer对象对imageView进行设置图片的操作。当然,这一过程中,不断的通过ImageLoader这个监听对外汇报任务状态。真真切切的观察者模式,一举一动尽在掌握。
到这里主体的框架已经介绍完毕。是否感觉就这么回事,这一流程不就是普普通通的图片缓存库该做的事情么。其实它真正的妙处在于面向接口的设计,如上图,ImageDecoder与ImageDownloader就只是一个接口关联。并没有关系具体实现类,本库中提供了多种多样的实现类。如图:
通过初始化的配置,根据不同的网络状况选择不同的Downloader,自由的拆卸和组合,让人用起来得心应手。
观察上图,或许读者有一个疑问,BitmapDisplayer为何置于DisplayOptions中而不是LoadAndDisplayTask的一部分,这也是作者的一个设计妙处。首先我们回到一开始的接口。
public void displayImage(String uri, ImageView imageView, DisplayImageOptions options,ImageLoadingListener listener);
用户使用这个接口,可以对每一次的加载图片操作进行不同的配置,不同的BitmapDisplayer,库中也提供了多种BitmapDisplayer接口的实现:
甚至可以自定义,使用自己实现的BitmapDisplayer,现阶段做的项目就通过实现自定义的Displayer实现了显示图片的怦然心动动画效果。
实现代码如下:
三、总结:
UnversalImageLoader中还有许多值得我们学习的地方,譬如多线程中锁ReetranLock类的使用和异常处理。本文的重点是介绍其设计中合理性,技术要点将在新的文档实践和介绍,这里暂不花费篇幅阐述
使用开源库不应该只满足其如何使用,更应该了解并且探究它。我们的目标并不是重复发明轮子,但是发明轮子的能力是必须要有的。
相关推荐
JAVA缓存研究之剖析Jive的缓存机制JAVA缓存研究之剖析Jive的缓存机制
文件中包含图片缓存库Picasso和ImageLoader的两个Demo,工程中有详细的注释
Android中非常好图片缓存ImageCache,是国外的大牛写的,比较完整系统,但是本人认为也有几个缺点,比如获取磁盘缓存目录的方法,不过,总体非常还是很好的,基本满足各种场景,希望对你有所帮助!
《Web安全深度剖析》总结了当前流行的高危漏洞的形成原因、攻击手段及解决方案,并通过大量的示例代码复现漏洞原型,制作模拟环境,更好地帮助读者深入了解Web应用程序中存在的漏洞,防患于未然。 《Web安全深度剖析...
利用现有的开源的图片缓存框架实现的图片缓存下载,测试程序在TestLoadImage中
Universal ImageLoader是最早开源的 Android 图片缓存库, 强大的缓存机制。功能特点:支持多线程加载图片(同步或者异步加载)具有很高的定制性每一张图片都有很多备用资源(原始图片、内存缓存、Bitmap等 )图片能...
完美的网络图片缓存 Android
图片缓存实现例子(ImageCacheDome)图片缓存实现例子(ImageCacheDome)图片缓存实现例子(ImageCacheDome)图片缓存实现例子(ImageCacheDome)图片缓存实现例子(ImageCacheDome)图片缓存实现例子(ImageCacheDome)
浏览器缓存机制介绍与缓存策略剖析.pptx
Android Google官网的图片缓存源码
图片缓存和水印图片缓存和水印
listView快速滑动图片缓存实例.欢迎大家下载学习
iphone 图片缓存 测试可以用。SDWebImage。
实现Android中WebView图片的缓存,并且实现如何替换WebView中默认图片以及如何实现图片的点击。
图片缓存工具类
Android图片加载框架之Picasso非常好的图片加载缓存库 , 博客地址:http://blog.csdn.net/dickyqie/article/details/62233744
删除图片缓存文件.bat
图片缓存框架
Android图片缓存管理(管理SDK卡例子)。