转载请标明出处:

http://blog.csdn.net/developer_jiangqq/article/details/50439814

本文出自:【江清清的博客】

(一).前言:

已经半个月没有更新文章了,一方面是最近工作比较忙,另一方面我也在选择博客的题材。这次我主要讲解平时用的比较多的图片加载框架ImageLoader。虽然这个框架前不久作者已经停止更新了,不过这个图片加载框架我已经用了很久了。我深知框架使用简便是一方面,但是如果能够不仅会使用而且能够深知其中实现的原理才是最重要的。所以我把ImageLoader项目所有的代码阅读了一遍并且给每个类和相关方法添加了中文版本的注释。

本例以及UIL框架全部中文版本注释项目已经更新到github,有兴趣大家可以去clone,start或者fork。

地址https://github.com/jiangqqlmj/Android-Universal-Image-Loader-Modify

[顺便说一下,可以微信扫描关注左侧的二维码关注订阅号,获取最新文章哈~]

本次专题的文章主要会涉及到以下部分ImageLoader的介绍和使用,部分重要模块分析以及相关源码讲解。今天我们主要进行第一部分的讲解(ImageLoader基础介绍和使用讲解)。

(二).ImageLoader基本介绍:

我们在开发APP的时候肯定遇到加载图片的需求尤其是列表需要加载大量图片的时候,那么我们势必需要进行下载图片并且进行显示。但是由于内存等各方面的问题多多少少会遇到一些问题;例如:列表加载图片,图片错乱分布啦。或者出现OOM问题啦~~这时候我们需要开发图片异步加载并且可以适当压缩框架。例如:UIL(Universal-Image-Loader,github项目地址UIL项目地址)除此之外还有其他很多框架Glide,Fresco,Picasso等等很多。后面几个现在用的比较多而且还在更多。后面的文章我这边也会分享其他的图片加载框架。

UIL(Universal-Image-Loader)旨在提供一个强大的、灵活的和高度可定制的工具图像加载、缓存和显示功能。并且提供了许多配置选项和良好控制图像加载和缓存的过程。所以在之前长久的一段时间里,该框架的使用非常广且很方便哦。

UIL框架特点:

  • 支持多线程图片加载(同步或者异步)
  • 支持自定义配置ImageLoader,例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置
  • 支持自定义配置图片显示,例如:缓存开关选择,界面选项,图片加载进度以及显示
  • 支持图片内存缓存或者文件系统,设备SD缓存
  • 支持图片加载进度监听(包括图片下载进度监听)
  • 支持框架更多工具类的扩展
  • 同样可以支持例如ListView,GridView进行滑动的时候暂停或者恢复图片加载显示等功能。
  • 当然还有其他很过特点,具体大家读了源码就会知道啦….

(三).ImageLoader快速安装:

如果我们要使用ImageLoader大家都可以项目地址下载一份代码其中会有imageLoader的jar包引入到项目就可以了。整体项目中内容文件夹如下:

3.1.我们下载imageloader的jar包到我们项目libs文件夹中,然后关联即可(universal-image-loader-1.9.5.jar):

3.2.现在我们采用Android Studio开发项目了,我们只需要build.gradle中添加以下依赖即可:

compile'com.nostra13.universalimageloader:universal-image-loader:1.9.5'

3.3.项目配置文件需要添加相关权限(主要为访问网络权限,如果图片需要sdcard缓存还需要多添加一个权限)

  1. <manifest>
  2. <!-- Include following permission if you load images from Internet -->
  3. <uses-permission android:name="android.permission.INTERNET" />
  4. <!-- Include following permission if you want to cache images on SD card -->
  5. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  6. ...
  7. </manifest>

3.4.最后我们需要在第一次使用ImageLoader之前,做一下ImageLoader的基础配置,该项配置可以在application或者activity中做即可,如下方式:

  1. ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this)
  2. ...
  3. .build();
  4. ImageLoader.getInstance().init(config);

3.5.下面我们就可以具体使用ImageLoader来进行加载和显示图片啦。

(四).ImageLoader全局配置项(Configuration)

上面3.4中我们讲到了ImageLoader在使用之前需要进行全局配置一下。OK,ImageLoader给我们提供了一个ImageLoaderConfiguration来进行全局设置ImageLoader。不过该设置是全局的,我们只需要设置一次即可了。

查看ImageLoader文档以及ImageLoaderConfiguration源码发现,该为我们提供了所有的配置项都是可选的。除非你需要自定义设置,模板我们可以调用该其中默认构造的方法如下:

ImageLoaderConfiguration configuration=ImageLoaderConfiguration.createDefault(this);

ImageLoader.getInstance().init(configuration);

上面的createDefault方法会给我们默认初始化一些配置项,具体所有配置可选项如下图:

上面包括设置缓存大小,任务执行器,线程池线程数量,线程权重,任务执行算法,磁盘缓存大小,缓存文件数量,缓存文件命名规则,图片下载器,解码器,图片显示配置项等等。大家可以随意根据项目实际情况配置即可了。

(五).ImageLoader图片Display配置项(Display Options)

上面我们讲到了ImageLoader的全局配置,在对于图片显示的时候(ImageLoader.displayImage(…)的时候),我们还可以设置图片显示的参数(主要使用DisplayImageOptions)。Display Options(显示可选项)用于每次图片显示任务的时候(ImageLoader.displayImage()该方法被调用)。

【注意】如果我们没有设置图片显示配置项,那么我在显示图片的时候会默认调用图片默认显示方式。具体可选配置项如下:

上面包括图片加载过程中,图片地址为空以及图片加载失败的图片,加载延时,开启内存缓存以及磁盘缓存,图片缩放类型,图片编码类型以及图片显示加载器等等参数。具体根据实际项目选择配置即可。

(六).ImageLoader加载图片讲解

现在我们开始讲解使用ImageLoader加载图片啦,在这之前大家一定要按照第三点的内容ImageLoader要安装一下以及做一下基本权限以及全局配置哦~下面我们首先看一下ImageLoader来显示图片的几个方法:

查看上面ImageLoader的方法图看:主要分为下面三种方式加载图片啦~我们在项目中一般使用前两种哦(displayImage和loadImage),因为这两种是异步的,另外的loadImageSync是同步的啦。

6.1.dispalyImage()方法使用讲解:

6.1.1本例中我ImageLoader全局是采用默认配置的如下:

  1. public class UILApplication extends Application {
  2. @Override
  3. public void onCreate() {
  4. super.onCreate();
  5. initImageLoader();
  6. }
  7. private void initImageLoader(){
  8. ImageLoaderConfiguration configuration=ImageLoaderConfiguration.createDefault(this);
  9. ImageLoader.getInstance().init(configuration);
  10. }
  11. }

实例布局文件如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. androidlayout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical"
  6. android:gravity="center">
  7. <ImageView
  8. android:id="@+id/test_img_one"
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content"
  11. android:src="@drawable/ic_data_loading"/>
  12. </LinearLayout>

然后Activitity实例化控件以及ImageLoader,调用displayImage方法即可:

  1. ImageView test_img_one=(ImageView)this.findViewById(R.id.test_img_one);
  2. ImageLoader.getInstance().displayImage(ImageDataUtils.ImagesUtils[0],test_img_one);

6.1.2.上边我们采用displayImage是两个参数的方法,我们同时可以在这边加入图片显示参数配置如下即可:

  1. ImageView test_img_one=(ImageView)this.findViewById(R.id.test_img_one);
  2. DisplayImageOptions options=new DisplayImageOptions.Builder()
  3. .showImageOnLoading(R.drawable.ic_data_loading)
  4. .showImageOnFail(R.drawable.ic_data_error)
  5. .cacheInMemory(true)
  6. .cacheOnDisk(true)
  7. .build();
  8. ImageLoader.getInstance().displayImage(ImageDataUtils.ImagesUtils[1],test_img_one,options);

上面我们配置加载过程中和加载失败显示的图片以及开启内存和磁盘缓存功能运行效果如下:

6.1.3.在显示的时候我们还可以加入图片的目标尺寸,如下:

  1. ImageSize size=new ImageSize(100,50);
  2. ImageLoader.getInstance().displayImage(ImageDataUtils.ImagesUtils[1],test_img_one,size);

这边构造一个ImageSize对象来定义目标图片的宽度和高度,传入宽100,高50,运行效果如下:

6.1.4.除了上面的三个显示重载方法之外,我们还可以传入一个图片加载进度监听器进入,具体接口回调我们放入到下面loadImage()方法中讲解。

6.2.loadImage()方法使用讲解:

上面6.1我们已经对displayImage()方法做了一些讲解,现在我们对于另外一个异步加载图片方法loadImage做一下讲解。本例中我这边采用TwoActivity以及一个简单布局:该布局中就放入一个ImageView即可。全局配置和上面一样。

6.2.1.loadImage(Stringuri, ImageLoadingListener listener)

该传入两个参数第一个为图片下载地址,第二个为图片加载监听器首先采用默认的接口如下设置:

  1. ImageView test_img_two=(ImageView)this.findViewById(R.id.test_img_two);
  2. ImageLoader.getInstance().loadImage(ImageDataUtils.ImagesUtils[3], new ImageLoadingListener() {
  3. @Override
  4. public void onLoadingStarted(String imageUri, View view) {
  5. //图片开始加载的时候调用
  6. Log.d("zttjiangqq","onLoadingStarted...");
  7. }
  8. @Override
  9. public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
  10. //图片加载失败调用
  11. Log.d("zttjiangqq","onLoadingFailed...");
  12. }
  13. @Override
  14. public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
  15. //图片加载完成调用
  16. Log.d("zttjiangqq","onLoadingComplete...");
  17. test_img_two.setImageBitmap(loadedImage);
  18. }
  19. @Override
  20. public void onLoadingCancelled(String imageUri, View view) {
  21. //图片加载取消调用
  22. Log.d("zttjiangqq","onLoadingCancelled...");
  23. }
  24. });

具体运行打印的日志和运行结果如下:

我们看到使用ImageLoadingListener接口必须要实现接口中四个方法,但是我们平时实际情况下可能不需要回调那么多方法,不错的是UIL给我们提供了一个类SimpleImageLoadingListener类,该类实现了ImageLoadingListener接口。我们传入该实现类即可,这样我们重写实际所需的方法就方便多了。具体实例如下

  1. ImageLoader.getInstance().loadImage(ImageDataUtils.ImagesUtils[4],new SimpleImageLoadingListener(){
  2. @Override
  3. public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
  4. super.onLoadingComplete(imageUri, view, loadedImage);
  5. //图片加载完成时候调用
  6. Log.d("zttjiangqq","onLoadingComplete...");
  7. test_img_two.setImageBitmap(loadedImage);
  8. }
  9. @Override
  10. public void onLoadingStarted(String imageUri, View view) {
  11. super.onLoadingStarted(imageUri, view);
  12. //图片开始加载的时候调用
  13. Log.d("zttjiangqq", "onLoadingStarted...");
  14. }
  15. });

这边我只重写了onLoadingComplete和onLoadingStarted两个方法,代码量上面就减少了很多。

6.2.2.loadImage(Stringuri, ImageSize targetImageSize, DisplayImageOptions options,ImageLoadingListenerlistener)

该加载图片方法6.1中讲得差不多,我们同时可以传入图片显示配置项,具体示例如下:

  1. DisplayImageOptions options=new DisplayImageOptions.Builder()
  2. .showImageOnLoading(R.drawable.ic_data_loading)
  3. .showImageOnFail(R.drawable.ic_data_error)
  4. .cacheInMemory(true)
  5. .cacheOnDisk(true)
  6. .build();
  7. ImageLoader.getInstance().loadImage(ImageDataUtils.ImagesUtils[5],options,new SimpleImageLoadingListener(){
  8. @Override
  9. public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
  10. super.onLoadingComplete(imageUri, view, loadedImage);
  11. //图片加载完成时候调用
  12. Log.d("zttjiangqq","onLoadingComplete...");
  13. test_img_two.setImageBitmap(loadedImage);
  14. }
  15. });

6.2.3.loadImage(Stringuri, ImageSize targetImageSize, ImageLoadingListener listener)

该加载图片方式我们可以传入目标图片的尺寸大小,用起来直接构造一个ImageSize传入进去就可以了。具体方法如下:

  1. ImageSize size=new ImageSize(100,50);
  2. ImageLoader.getInstance().loadImage(ImageDataUtils.ImagesUtils[6],size,new SimpleImageLoadingListener(){
  3. @Override
  4. public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
  5. super.onLoadingComplete(imageUri, view, loadedImage);
  6. //图片加载完成时候调用
  7. Log.d("zttjiangqq","onLoadingComplete...");
  8. test_img_two.setImageBitmap(loadedImage);
  9. }
  10. });

6.2.4.主要就是以上几种方式,其他的图片加载方法和以上的差不多,只需要传入对应的参数就可以了。

(七).最后总结

今天我们对于UIL(Universal-Image-Loader)开源框架的介绍和基本使用做了相关讲解,包括介绍,安装,配置以及基本使用方面。下一讲会着重讲解该开源组件几个核心的类以及相关使用注意事项。

本例以及UIL框架全部中文版本注释项目已经更新到github,有兴趣大家可以去clone,start或者fork。

地址https://github.com/jiangqqlmj/Android-Universal-Image-Loader-Modify

尊重原创,转载请注明:From Sky丶清(http://blog.csdn.net/developer_jiangqq) 侵权必究!

ImageLoader_ _Universal-Image-Loader完全解析(一)之介绍与使用详解的更多相关文章

  1. 数据结构图文解析之:二叉堆详解及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  2. Java解析HTML之HTMLParser使用与详解 分类: C_OHTERS 2014-05-19 21:46 2309人阅读 评论(0) 收藏

    转自:http://free0007.iteye.com/blog/1131163 HTMLParser具有小巧,快速的优点,缺点是相关文档比较少(英文的也少),很多功能需要自己摸索.对于初学者还是要 ...

  3. 《Java面试全解析》505道面试题详解

    <Java面试全解析>是我在 GitChat 发布的一门电子书,全书总共有 15 万字和 505 道 Java 面试题解析,目前来说应该是最实用和最全的 Java 面试题解析了. 我本人是 ...

  4. 四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)

    众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml- ...

  5. 转:VC解析XML文件-CMarkup的使用详解

    本篇文章是对VC解析XML文件-CMarkup的使用进行了详细的分析介绍,需要的朋友参考下 VC解析XML文件的工具有很多,CMarkup, tinyXML,还有IBM的,MS的等等. 据说tinyX ...

  6. Ajax中解析Json的两种方法详解

    eval();  //此方法不推荐 JSON.parse();  //推荐方法 一.两种方法的区别 我们先初始化一个json格式的对象: var jsonDate = '{ "name&qu ...

  7. 四种生成和解析XML文档的方法详解

    众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml- ...

  8. JavaScript解析机制与闭包原理实例详解

    js代码解析机制: js代码解析之前会创建一个如下的词法环境对象(仓库):LexicalEnvironment{ } 在扫描js代码时会把: 1.用声明的方式创建的函数的名字; 2.用var定义的变量 ...

  9. 大杂烩 -- 四种生成和解析XML文档的方法详解

    基础大杂烩 -- 目录 众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J DOM:在现在的Java JDK里都自带了,在xml-apis.jar包 ...

随机推荐

  1. 【NOIP2007】矩阵取数

    因为傻逼写错高精度搞了一下午浪费好多时间,好想哭qaq 原题: 帅帅经常更同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij据为非负整数.游戏规则如下: 1. 每次取数时须从每 ...

  2. Python 基础语法(二)

    Python 基础语法(二) --------------------------------------------接 Python 基础语法(一) ------------------------ ...

  3. 【转】 iOS 开发之静态库.a和动态库详解 -- 不错

    原文网址:http://blog.csdn.net/lxl_815520/article/details/52154331 一, 简单介绍 1.什么是库 库是程序代码的集合,是共享程序代码的一种方式 ...

  4. AssetStore资源名字

    NGUI A Pathfinding Project Pro PlayMaker 2DToolkit Scene Manager UniLOD UniLUA Save Game-JSON+Binary ...

  5. ogg 、 Shareplex和DSG RealSync 对比

    主流数据库容灾(复制)工具对比     Oracle Golden Gate Quest Shareplex DSG RealSync   公司概要   公司介绍 GoldenGate公司成立于200 ...

  6. 动态加载dll,并创建类对象放入到list中。

    private List<IVisualControlsPlug> visualPlugs = new List<IVisualControlsPlug>(); public ...

  7. Unity3D研究院之使用Animation编辑器编辑动画

     Unity提供了Animation编辑器,它可以为我们编辑物理动画.举个例子比如场景中有一个来回摇动的秋千,这个秋千在项目中完全只起到衬托作用,它不会与别的游戏对象有任何交互.如果这个秋千也用代码来 ...

  8. oracle的高可用与负载均衡

    浏览了一下Oracle官方的网页以及非官方的ppt,简单了解了一下Oracle提供的高可用方案.1. RACRAC,  Real Application Clusters多个Oracle服务器组成一个 ...

  9. web.xml文件中配置<mime-mapping>下载文件类型

    TOMCAT在默认情况下下载.rar的文件是把文件当作text打开,以至于IE打开RAR文件为乱码,如果遇到这种情况时不必认为是浏览器的问题,大多数浏览器应该不会死皮赖脸地把二进制文件当作文本打开,一 ...

  10. Spring3.0.6定时任务task:scheduled

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...