一、 本文由来:
让更多的人审核和发现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类的使用和异常处理。本文的重点是介绍其设计中合理性,技术要点将在新的文档实践和介绍,这里暂不花费篇幅阐述
使用开源库不应该只满足其如何使用,更应该了解并且探究它。我们的目标并不是重复发明轮子,但是发明轮子的能力是必须要有的。
相关推荐
本篇将深度剖析一款名为“douBanList”的Android应用源码,它实现了滚动到底部自动加载新数据、软缓存以及懒加载等关键功能,这些都是现代移动应用中不可或缺的设计模式。 首先,滚动到底部加载新数据,通常被称为...
5. **图片缓存**: rs-SDURLCache特别适用于图片加载场景,它能够高效地缓存网络图片,避免因反复下载同一图片而消耗流量。同时,通过集成SDWebImage库,可以实现图片的自动缩放和解码,进一步优化性能。 6. **...
本文将对xUtils3.5的源码进行深度剖析,帮助读者了解其内部机制,提升Android开发技能。 首先,xUtils的核心设计理念是模块化。它将常用的功能如Http、View、Db、Event等封装成独立的模块,开发者可以根据实际需求...
同时,通过内存管理、懒加载策略以及图片缓存库(如Glide或Picasso)的使用,确保了应用在运行时的流畅性。 最后,豆瓣客户端可能集成了第三方库,如OkHttp、Gson、Dagger等,这些都是Android开发者常用的工具库,...
《PhotoStore_java_family9w8_:深度剖析图片浏览器源码》 在IT行业中,源码分析是一项重要的技能,它能让我们深入理解软件的工作原理,从而提升我们的编程能力。今天,我们将聚焦于“PhotoStore_java_family9w8_”...
本文将针对"android 新浪微博源码1.2版"进行深度剖析,主要涉及ListView优化、异步图片加载、分页处理以及搜索界面中的地图定位功能。 首先,ListView是Android开发中常用的组件,用于展示大量的数据列表。在旧版本...
- **简介**:Glide是一个专注于图片加载和缓存的Android库,支持多种图片格式和数据源。 - **特点**: - 内置多种图片变换功能。 - 自动缓存机制,减少网络请求。 - 高效的内存管理。 #### 7. **Timber** - *...
本文将针对"Android仿QQ邮箱客户端源码"进行深度剖析,探讨其背后的关键技术和实现原理。 首先,Android仿QQ邮箱客户端的开发涉及到Android SDK的多个模块,包括UI设计、网络通信、数据存储和多线程处理等。开发者...
本篇文章将对“高仿京东商城源码”进行深度剖析,帮助Android开发者了解并学习如何构建一个高效、流畅且具有丰富功能的电商应用。 首先,我们来看看这个项目的整体架构。高仿京东商城源码通常会遵循MVP(Model-View...
本文将对这个项目的源码进行深度剖析,揭示其中的关键技术和设计理念,帮助读者提升在Android应用开发,特别是电商应用开发领域的专业技能。 首先,我们需要明确“红孩子网上商城客户端”是基于Android平台的,这...
在"libraries"目录下,我们可以看到项目使用的第三方库,这通常包括网络请求库、数据解析库、图片加载库等。比如,可能包含了Retrofit用于网络通信,Gson用于JSON数据解析,以及Picasso或Glide用于图片加载。这些库...
《Zhuyi.Utility:全能编程助手的深度剖析》 Zhuyi.Utility是一个极其重要的工具库,为编程工作提供了丰富的功能,极大地提升了开发效率。它涵盖了从基础操作到复杂任务的各种需求,包括缓存管理、配置文件处理、...
通过深度剖析小米文件管理器的源码,开发者可以提升对Android系统、文件操作、UI设计、性能优化等多个方面的理解,为自己的项目开发积累宝贵经验。同时,这也是一个学习Android最佳实践、提升编程技巧的好机会。
5. **图片加载库**:如Glide或Picasso,用于高效加载和缓存网络图片,避免内存溢出。 6. **权限管理**:Android 6.0后引入运行时权限,需要动态申请权限。 7. **UI动画**:了解如何使用Android的动画系统,增强...
本篇文章将围绕"tap-standalonewin-sdk-源码"这一主题,对这个Windows独立版本的Tap SDK进行深度剖析,帮助读者理解其内部机制,提升Windows平台上的应用开发能力。 首先,"tap"通常代表"Tap广告平台",这是一种...
应用中图片的加载和缓存是一个常见问题,滴答词典可能使用了Glide或Picasso等图片加载库。源码中会有关于图片URL的处理和图片加载策略的实现。 7. **权限管理与生命周期** 针对Android的权限系统,源码可能会包含...
通过对"oschina-android-app"源码的深度剖析,开发者不仅可以了解到一个实际应用的完整流程,还能掌握到Android开发的实战技巧和最佳实践。这不仅有助于提升个人技能,也有利于在实际项目中应用和创新。
本文将围绕xUtils3的源码进行深度剖析,并结合实际案例,帮助读者理解并熟练运用这个框架。 首先,我们来看看xUtils3的核心组件: 1. **网络请求模块**:xUtils3中的HttpService提供了GET、POST等常见的HTTP请求...
4. **图片加载与优化**:在处理大量图片时,如用户头像和微博配图,源码可能会采用Picasso、Glide或Fresco等图片加载库,以解决内存管理和图片缓存问题,确保流畅的用户体验。 5. **权限管理**:随着Android系统...
网易客户端的源码会体现出各种性能优化技巧,如图片加载库(如 Glide 或 Picasso)的使用、内存管理、资源懒加载、异步加载等。 7. 权限管理与安全 Android 6.0及以上版本需要动态申请权限,源码中会有相关处理...