`
heyixian
  • 浏览: 12968 次
社区版块
存档分类
最新评论

图片缓存库之深度剖析

阅读更多

 

 

 

一、 本文由来:

让更多的人审核和发现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对象,LoadAndDisplayProgressAndDisplay的任务,根据名字就可以知道其功能。类关系如下:



  

ProgressAndDisplayTask相比LoadAndDisplay多了一个显示加载中图片的功能,只是在LoadAndDisplay之前多做了一步设置加载中图片的操作。

以下是LoadandDisplayTask的类关系视图:



  

如图,LoadAndDisplayTask类根据配置,调用ImageDownloaderImageDecoder进行图片的下载和解码,最后通过DisplayImageOptions中的bitmapDisplayer对象对imageView进行设置图片的操作。当然,这一过程中,不断的通过ImageLoader这个监听对外汇报任务状态。真真切切的观察者模式,一举一动尽在掌握。

到这里主体的框架已经介绍完毕。是否感觉就这么回事,这一流程不就是普普通通的图片缓存库该做的事情么。其实它真正的妙处在于面向接口的设计,如上图,ImageDecoderImageDownloader就只是一个接口关联。并没有关系具体实现类,本库中提供了多种多样的实现类。如图:



  

通过初始化的配置,根据不同的网络状况选择不同的Downloader,自由的拆卸和组合,让人用起来得心应手。

观察上图,或许读者有一个疑问,BitmapDisplayer为何置于DisplayOptions中而不是LoadAndDisplayTask的一部分,这也是作者的一个设计妙处。首先我们回到一开始的接口。

public void displayImage(String uri, ImageView imageView, DisplayImageOptions options,ImageLoadingListener listener);

用户使用这个接口,可以对每一次的加载图片操作进行不同的配置,不同的BitmapDisplayer,库中也提供了多种BitmapDisplayer接口的实现:



  

甚至可以自定义,使用自己实现的BitmapDisplayer,现阶段做的项目就通过实现自定义的Displayer实现了显示图片的怦然心动动画效果。

实现代码如下:



  

 

 

 

三、总结:

UnversalImageLoader中还有许多值得我们学习的地方,譬如多线程中锁ReetranLock类的使用和异常处理。本文的重点是介绍其设计中合理性,技术要点将在新的文档实践和介绍,这里暂不花费篇幅阐述

使用开源库不应该只满足其如何使用,更应该了解并且探究它。我们的目标并不是重复发明轮子,但是发明轮子的能力是必须要有的。

 

  • 大小: 69.2 KB
  • 大小: 23.1 KB
  • 大小: 54.3 KB
  • 大小: 77.2 KB
  • 大小: 3.1 KB
  • 大小: 2.7 KB
  • 大小: 45.8 KB
分享到:
评论

相关推荐

    应用源码之douBanList(滚动到底部加载新的,软缓存,懒加载).zip

    本篇将深度剖析一款名为“douBanList”的Android应用源码,它实现了滚动到底部自动加载新数据、软缓存以及懒加载等关键功能,这些都是现代移动应用中不可或缺的设计模式。 首先,滚动到底部加载新数据,通常被称为...

    IOS应用源码——rs-SDURLCache-1.2-5-g4b6ee0e.rar

    5. **图片缓存**: rs-SDURLCache特别适用于图片加载场景,它能够高效地缓存网络图片,避免因反复下载同一图片而消耗流量。同时,通过集成SDWebImage库,可以实现图片的自动缩放和解码,进一步优化性能。 6. **...

    xUtils3.5源码

    本文将对xUtils3.5的源码进行深度剖析,帮助读者了解其内部机制,提升Android开发技能。 首先,xUtils的核心设计理念是模块化。它将常用的功能如Http、View、Db、Event等封装成独立的模块,开发者可以根据实际需求...

    Android豆瓣移动客户端源码

    同时,通过内存管理、懒加载策略以及图片缓存库(如Glide或Picasso)的使用,确保了应用在运行时的流畅性。 最后,豆瓣客户端可能集成了第三方库,如OkHttp、Gson、Dagger等,这些都是Android开发者常用的工具库,...

    PhotoStore_java_family9w8_

    《PhotoStore_java_family9w8_:深度剖析图片浏览器源码》 在IT行业中,源码分析是一项重要的技能,它能让我们深入理解软件的工作原理,从而提升我们的编程能力。今天,我们将聚焦于“PhotoStore_java_family9w8_”...

    android 新浪微博源码1.2版

    本文将针对"android 新浪微博源码1.2版"进行深度剖析,主要涉及ListView优化、异步图片加载、分页处理以及搜索界面中的地图定位功能。 首先,ListView是Android开发中常用的组件,用于展示大量的数据列表。在旧版本...

    BAT大牛带你深度解析Android 10大开源框架内容(只需3积分)

    - **简介**:Glide是一个专注于图片加载和缓存的Android库,支持多种图片格式和数据源。 - **特点**: - 内置多种图片变换功能。 - 自动缓存机制,减少网络请求。 - 高效的内存管理。 #### 7. **Timber** - *...

    Android仿QQ邮箱客户端源码.zip

    本文将针对"Android仿QQ邮箱客户端源码"进行深度剖析,探讨其背后的关键技术和实现原理。 首先,Android仿QQ邮箱客户端的开发涉及到Android SDK的多个模块,包括UI设计、网络通信、数据存储和多线程处理等。开发者...

    Android代码-高仿京东商城源码.zip

    本篇文章将对“高仿京东商城源码”进行深度剖析,帮助Android开发者了解并学习如何构建一个高效、流畅且具有丰富功能的电商应用。 首先,我们来看看这个项目的整体架构。高仿京东商城源码通常会遵循MVP(Model-View...

    红孩子网上商城客户端(android)

    本文将对这个项目的源码进行深度剖析,揭示其中的关键技术和设计理念,帮助读者提升在Android应用开发,特别是电商应用开发领域的专业技能。 首先,我们需要明确“红孩子网上商城客户端”是基于Android平台的,这...

    oschina android app 2.2.1 源码收藏

    在"libraries"目录下,我们可以看到项目使用的第三方库,这通常包括网络请求库、数据解析库、图片加载库等。比如,可能包含了Retrofit用于网络通信,Gson用于JSON数据解析,以及Picasso或Glide用于图片加载。这些库...

    Zhuyi.Utility

    《Zhuyi.Utility:全能编程助手的深度剖析》 Zhuyi.Utility是一个极其重要的工具库,为编程工作提供了丰富的功能,极大地提升了开发效率。它涵盖了从基础操作到复杂任务的各种需求,包括缓存管理、配置文件处理、...

    Android源码——小米文件管理器源码.zip

    通过深度剖析小米文件管理器的源码,开发者可以提升对Android系统、文件操作、UI设计、性能优化等多个方面的理解,为自己的项目开发积累宝贵经验。同时,这也是一个学习Android最佳实践、提升编程技巧的好机会。

    Android应用源码之四次元新浪微博客户端项目.zip

    5. **图片加载库**:如Glide或Picasso,用于高效加载和缓存网络图片,避免内存溢出。 6. **权限管理**:Android 6.0后引入运行时权限,需要动态申请权限。 7. **UI动画**:了解如何使用Android的动画系统,增强...

    tap-standalonewin-sdk-源码.rar

    本篇文章将围绕"tap-standalonewin-sdk-源码"这一主题,对这个Windows独立版本的Tap SDK进行深度剖析,帮助读者理解其内部机制,提升Windows平台上的应用开发能力。 首先,"tap"通常代表"Tap广告平台",这是一种...

    Android源码——滴答词典源码.zip

    应用中图片的加载和缓存是一个常见问题,滴答词典可能使用了Glide或Picasso等图片加载库。源码中会有关于图片URL的处理和图片加载策略的实现。 7. **权限管理与生命周期** 针对Android的权限系统,源码可能会包含...

    安卓Android源码——oschina--app.zip

    通过对"oschina-android-app"源码的深度剖析,开发者不仅可以了解到一个实际应用的完整流程,还能掌握到Android开发的实战技巧和最佳实践。这不仅有助于提升个人技能,也有利于在实际项目中应用和创新。

    xUtils3 源码跟案例

    本文将围绕xUtils3的源码进行深度剖析,并结合实际案例,帮助读者理解并熟练运用这个框架。 首先,我们来看看xUtils3的核心组件: 1. **网络请求模块**:xUtils3中的HttpService提供了GET、POST等常见的HTTP请求...

    Android源码——腾讯微博客户端源码.7z

    4. **图片加载与优化**:在处理大量图片时,如用户头像和微博配图,源码可能会采用Picasso、Glide或Fresco等图片加载库,以解决内存管理和图片缓存问题,确保流畅的用户体验。 5. **权限管理**:随着Android系统...

    Android源码——网易客户端源码.zip

    网易客户端的源码会体现出各种性能优化技巧,如图片加载库(如 Glide 或 Picasso)的使用、内存管理、资源懒加载、异步加载等。 7. 权限管理与安全 Android 6.0及以上版本需要动态申请权限,源码中会有相关处理...

Global site tag (gtag.js) - Google Analytics