Android-Universal-Image-Loader框架学习

先来看一下Android-Universal-Image-Loader框架的用法;

1、初始化ImageLoaderConfiguration(全局的,在整个application中初始化configuration,配置缓存、加载线程等)、

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder( getApplicationContext()) .threadPriority(Thread.NORM_PRIORITY - 2)// 设置线程的优先级 .denyCacheImageMultipleSizesInMemory()// 当同一个Uri获取不同大小的图片,缓存到内存时,只缓存一个。默认会缓存多个不同的大小的相同图片 .discCacheFileNameGenerator(new Md5FileNameGenerator())// 设置缓存文件的名字 .discCacheFileCount(60)// 缓存文件的最大个数 .tasksProcessingOrder(QueueProcessingType.LIFO)// 设置图片下载和显示的工作队列排序 .build(); // Initialize ImageLoader with configuration ImageLoader.getInstance().init(config);

3、创建图片显示选项:DisplayImageOptions options(根据不同的加载图片显示不同而构造不同的选项,主要配置图片加载过程中显示配置,缓存,显示动画);

DisplayImageOptions options; options = new DisplayImageOptions.Builder() .showStubImage(R.drawable.ic_launcher)// 设置图片在下载期间显示的图片 .showImageForEmptyUri(R.drawable.ic_launcher)// 设置图片Uri为空或是错误的时候显示的图片 .showImageOnFail(R.drawable.ic_launcher)// 设置图片加载/解码过程中错误时候显示的图片 .cacheInMemory(true)// 是否?存都?却嬷 .cacheOnDisc(true)// 是否?存到sd卡上 .displayer(new RoundedBitmapDisplayer(20)).build();

4、通过ImageLoader显示图片

// ImageLoader ImageLoader imageLoader = ImageLoader.getInstance(); // 第一个参数是uri,第二个参数是显示图片的imageView,第三个参数是刚刚构造的图片显示选项,第四个参数是加载的回调方法,displayImage有很多重载方法这中介其中一种; imageLoader.displayImage(imageUrls[position], holder.image, options, loadingListener)

要学习更详细使用方法,官方的demo直接在上面链接里面有下载;

嘿嘿,开始觉得上面这用法看起来是有点多,且感觉有点麻烦,但仔细研究你会发现它的功能之强大,从设置加载线程优先级别、图片缓存、图片显示包括显示动画等都在考虑在其中,它还有非常好的扩展性,用户可以根据需求配置各种不同的显示效果、加载动画等,综合来看设计是很巧妙的,下面来体会一下这个开源框架的强大设计:

----------------------------------------------------分割线------------------------------------------------------------------------

框架特点:

1、多线程的图像加载(线程池的大小,HTTP选项纱、线程控件等);

2、能够很好的监听加载过程;

3、图片显示配置接口(动画,圆角可扩展);

4、内存和磁盘高速缓存;

5、扩展性强,研发人员只需要根据需求实现它提供的各种接口即可;

框架里面使用最多的是建造者模式与策略模式,要从整个包结构开始看起才能更好的熟悉框架设计,才能更好的扩展它使之与自己工程融为一体; 看图,下图为整个开源框架的包结构:

Android-Universal-Image-Loader框架学习

啧啧,这里就不详叙了,框架里面命名很透彻,基本见名知意,它总共分为几大模块:vcD4KPHA+CjGhoru6tObEo7/po7sgz8LNvM6qu7q05sSjv+mw/L3hubnNvKO6PC9wPgo8cD4KPGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20140403/20140403091703154.png" alt="\">

主要分为disc和memory,这主要是磁盘缓存跟内存缓存管理,哈,咋看介么多类,其实大部分是官方提供给我们的策略实现,这里主要用的是策略模式,来分析一下这个包结构: 其实这里我们只要关注两个类,分别是disc和memory下面的DiscCacheAware、MemoryCacheAwarer这两个接口,它提供给了我们外部调用所需要的接口,外部也是直接使用这两个接口,而impl里面则是对这两个类的实现,将接口的行为方法进行不同的策略实现即真正执行的代码; 而我们需要使用的时候,只需要在配置ImageLoaderConfiguration的时候,根据需要配置对应的DiscCacheAware、MemoryCacheAwarer的子类实现即可;

这样做即结构清晰,而且当我们有自己的需求的时候,我们只需要继承这两个接口,定义自己的策略行为即可,不需要修改任何代码逻辑;

2、解码模块: 下图为解码模块包结构图:

看似简单,姑且就当做一个模块吧,结构跟缓存模块类似,我们主要关注ImageDecoder接口,它只有一个方法Bitmap decode(ImageDecodingInfo imageDecodingInfo),其意根据imageDecodingInfo提供给他的解码信息,进行解码,得到我们需要的bitmap;这里应该就明白这个模块的功能了吧!

官方只提供给了我们一个实现类即BaseImageDecoder,这里实现细节就不记录了。 3、显示模块: 下图为显示模块包结构图:

Android-Universal-Image-Loader框架学习

结构再也不陌生了,啧啧,此模块核心接口ImageDownloader,图片下载,这个接口里面定义了一个内部枚举类Scheme,不得不被如此强大的功能折服了: Scheme代码:

public enum Scheme { HTTP("http"), HTTPS("https"), FILE("file"), CONTENT("content"), ASSETS("assets"), DRAWABLE("drawable"), UNKNOWN(""); private String scheme; private String uriPrefix; Scheme(String scheme) { this.scheme = scheme; uriPrefix = scheme + "://"; } /** * Defines scheme of incoming URI * * @param uri URI for scheme detection * @return Scheme of incoming URI */ public static Scheme ofUri(String uri) { if (uri != null) { for (Scheme s : values()) { if (s.belongsTo(uri)) { return s; } } } return UNKNOWN; } private boolean belongsTo(String uri) { return uri.toLowerCase(Locale.US).startsWith(uriPrefix); } /** Appends scheme to incoming path */ public String wrap(String path) { return uriPrefix + path; } /** Removed scheme part ("scheme://") from incoming URI */ public String crop(String uri) { if (!belongsTo(uri)) { throw new IllegalArgumentException(String.format("URI [%1$s] doesn't have expected scheme [%2$s]", uri, scheme)); } return uri.substring(uriPrefix.length()); } }

Scheme定义了支持的下载图片地址协议,包括content,assets,drawable下的图片都可以做为uri来下载,通过将assets,drawable地址前面加上协议头,来统一管理图片源,着实高;并且给出了判断是否是支持类型的各种方法;

整个显示流程就是这样:下载-->缓存-->解码-->显示,生生不息啊。

5、listener包,这里仅仅是提供给我们了各样的回调,通过这里,我们大致能看到这个框架能让我们做什么,能否实现我们的需求,当然,你够熟悉它,你也可以根据需求添加自己的回调;

6、util包,工具类包!

上面几个模块的设计都是可扩展的,可以在不修改整体代码的情况下通过实现不同的策略行为达到我们的需求。一个好的框架既有强大的功能,又有良好的结构性与扩展性;

啧,怎么越看越空虚,想想自己之前写的图片下载工具,考虑的方面与功能简直弱爆了!

框架学习比较粗糙,欢迎大神留言交流!

分类:默认分类 时间:2012-01-03 人气:12
本文关键词:
分享到:

相关文章

  • Android-Universal-Image-Loader异步加载图片框架学习研究 2013-03-31

    GitHub下载地址 https://github.com/nostra13/Android-Universal-Image-Loader 先来看一下Android-Universal-Image-Loader框架的用法; 1、初始化ImageLoaderConfiguration(全局的,在整个application中初始化configuration,配置缓存、加载线程等) ImageLoaderConfiguration config = new ImageLoaderConfigurati

  • android异步加载图片类(续)-universal-image-loader详解 2013-04-25

    之前写过一篇android异步加载图片类 ,后来接触了一个开源项目universal-image-loader,听说淘宝也是用这玩意 发现自己写的那个异步加载类太简单了,虽然功能是实现了,但是很多优化的问题都没有解决 比如: 同一个ui加载同一张图,会出现只加载一张,其他的加载不了 加载多图的时候会有oom等问题 现在来说说universal-image-loader 特点: 多线程的图像加载 的可能性的宽调谐对ImageLoader的配置(线程池的大小,HTTP选项,内存和光盘高速缓存,显示图

  • Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用 2013-12-19

    转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/26810303),请尊重他人的辛勤劳动成果,谢谢! 大家好!差不多两个来月没有写文章了,前段时间也是在忙换工作的事,准备笔试面试什么的事情,现在新工作找好了,新工作自己也比较满意,唯一遗憾的就是自己要去一个新的城市,新的环境新的开始,希望自己能尽快的适应新环境,现在在准备交接的事情,自己也有一些时间了,所以就继续给大家分享Android方面的东西。 相信大家

  • Android-Universal-Image-Loader 架构梳理 2014-05-30

    源码地址:点击打开链接 Android-Universal-Image-Loader的广泛使用,我们有必要好好研究下他,对于我们使用,和进步都有很多的帮助, 下载图片线程。 6、Downloader,下载任务模块,该模块是负责下载的,网络连接通过两种方式,一个是HttpClient,一个是HttpURLConnection,前者是apache封装的一个类,会保存cookie等信息,支持需要校验用户登录信息的后台服务,后者则不支持,该模块还包括网络慢时候的处理和网络连接失败时候的处理。 7、cac

  • android图片缓存框架Android-Universal-Image-Loader(二) 2013-12-02

    这篇打算直接告诉大家怎么用吧,其实这个也不是很难的框架,大致使用过程如下: // 获取缓存图片目录 File cacheDir = StorageUtils.getOwnCacheDirectory(activity, "imageloader/Cache"); ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder( activity).memoryCacheExtraOptions(800, 760) //

  • Android学习小Demo(19)利用Loader来实时接收短信 2014-09-19

    之前写过一篇文章《Android学习小Demo(13)Android中关于ContentObserver的使用》,在里面利用ContentOberver去监测短信URI内容的变化。我们先来回顾一下,是如何利用ContentOberver来监测短信内容的变化的。 1)要自定义一个类,比如SmsContentObserver,继承ContentObserver,并且实现其onChange方法。 2)在onChange方法中去查询对应Uri,比如短信收件箱的内容,并将对应的记录利用Handler发送到

  • (android高仿系列)今日头条 --新闻阅读器 (三) 完结 .总结 篇 2012-12-04

    从写第一篇今日头条高仿系列开始,到现在已经过去了1个多月了,其实大体都做好了,就是迟迟没有放出来,因为我觉得,做这个东西也是有个过程的,我想把这个模仿中一步一步学习的过程,按照自己的思路写下来,在根据碰到的知识点和问题,并且罗列出这些东西的知识点和使用方法。如果你单纯的把做好的一个DEMO拿去改改用用,那样,你永远不知道里面用到的内容是涉及到什么知识点,用什么方法实现,那样就没有多少提升价值而言了。 近期都是在通过开发文档把以前的一些东西重新过一遍,看好多网友都催促想要新版本的,那我就在这里先把

  • Android 中查看内存的使用情况集常用adb命令 2013-03-03

    1. 在IDE中查看Log信息 当程序运行垃圾回收的时候,会打印一条Log信息,其格式如下: D/dalvikvm: , , , GC_Reason表示导致垃圾回收的原因以及当前的回收类型,包括以下几类: GC_CONCURRENT:当堆中对象数量达到一定是触发的垃圾收集 GC_FOR_MALLOC:在内存已满的情况下分配内存,此时系统会暂停程序并回收内存 GC_HPROF_DUMP_HEAP:创建FPFOR文件来分析Heap时所造成的垃圾收集 GC_EXPLICIT: 程序调用了垃圾收集函数S

  • Android学习之--杂项 2013-04-10

    new关键字和newInstance()方法的区别 a. new可以调用带参数的构造函数,newInstance不可以 b. newInstance: 弱类型。低效率。只能调用无参构造。 new: 强类型。相对高效。能调用任何public构造。 c. new是自己下厨,做饭自己吃。newInstance是外面吃别人做给你吃。 自己做可以保证安全,而且可以有多个口味,什么酱,放多少自己定。new对象不会因为找不到类而出异常,而且你还可以调用多个构造函数,按照自己口味去new对象,去做一份符合自己口

Copyright (C) quwantang.com, All Rights Reserved.

趣玩堂 版权所有 京ICP备15002868号

processed in 0.053 (s). 10 q(s)