Android-Universal-Image-Loader三大组件DisplayImageOptions、ImageLoader、ImageLoaderConfiguration详解...

一、介绍

 Android-Universal-Image-Loader是 一个开源的UI组件程序,该项目的目的是提供一个可重复使用的仪器为异步图像加载,缓存和显示。所以,如果你的程序里需要这个功能的话,那么不妨试试它。 因为已经封装好了一些类和方法。我们 可以直接拿来用了。而不用重复去写了。其实,写一个这方面的程序还是比较麻烦的,要考虑多线程缓存,内存溢出等很多方面。

二、具体使用

一个好的类库的重要特征就是可配置性强。我们先简单使用Android-Universal-Image-Loader,一般情况下使用默认配置就可以了。

下面的实例利用Android-Universal-Image-Loader将网络图片加载到图片墙中。

复制代码
 1 public class BaseActivity extends Activity {
 2  ImageLoader imageLoader;  3  @Override  4 protected void onCreate(Bundle savedInstanceState) {  5 // Create global configuration and initialize ImageLoader with this configuration  6 ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())  7  .build();  8  ImageLoader.getInstance().init(config);  9 super.onCreate(savedInstanceState); 10  } 11 } 
复制代码
复制代码
  1 public class MainActivity extends BaseActivity {
 2  3  @Override  4 protected void onCreate(Bundle savedInstanceState) {  5 super.onCreate(savedInstanceState);  6  setContentView(R.layout.activity_main);  7  8 ImageLoader imageLoader = ImageLoader.getInstance();  9  10 GridView gridView = (GridView) this.findViewById(R.id.grdvImageWall);  11 gridView.setAdapter(new PhotoWallAdapter(Constants.IMAGES));  12  }  13  14 static class ViewHolder {  15  ImageView imageView;  16  ProgressBar progressBar;  17  }  18  19 public class PhotoWallAdapter extends BaseAdapter {  20  String[] imageUrls;  21  ImageLoader imageLoad;  22  DisplayImageOptions options;  23  LinearLayout gridViewItem;  24  25 public PhotoWallAdapter(String[] imageUrls) {  26 assert imageUrls != null;  27 this.imageUrls = imageUrls;  28  29 options = new DisplayImageOptions.Builder()  30 .showImageOnLoading(R.drawable.ic_stub) // resource or  31 // drawable  32 .showImageForEmptyUri(R.drawable.ic_empty) // resource or  33 // drawable  34 .showImageOnFail(R.drawable.ic_error) // resource or  35 // drawable  36 .resetViewBeforeLoading(false) // default  37 .delayBeforeLoading(1000).cacheInMemory(false) // default  38 .cacheOnDisk(false) // default  39 .considerExifParams(false) // default  40 .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default  41 .bitmapConfig(Bitmap.Config.ARGB_8888) // default  42 .displayer(new SimpleBitmapDisplayer()) // default  43 .handler(new Handler()) // default  44  .build();  45 this.imageLoad = ImageLoader.getInstance();  46  47  }  48  49  @Override  50 public int getCount() {  51 return this.imageUrls.length;  52  }  53  54  @Override  55 public Object getItem(int position) {  56 if (position <= 0 || position >= this.imageUrls.length) {  57 throw new IllegalArgumentException(  58 "position<=0||position>=this.imageUrls.length");  59  }  60 return this.imageUrls[position];  61  }  62  63  @Override  64 public long getItemId(int position) {  65 return position;  66  }  67  68  @Override  69 public View getView(int position, View convertView, ViewGroup parent) {  70 // 判断这个image是否已经在缓存当中,如果没有就下载  71 final ViewHolder holder;  72 if (convertView == null) {  73 holder = new ViewHolder(); 74 gridViewItem = (LinearLayout) getLayoutInflater().inflate( 75 R.layout.image_wall_item, null); 76 holder.imageView = (ImageView) gridViewItem 77 .findViewById(R.id.item_image); 78 holder.progressBar = (ProgressBar) gridViewItem 79 .findViewById(R.id.item_process); 80 gridViewItem.setTag(holder); 81 convertView = gridViewItem; 82 } else { 83 holder = (ViewHolder) gridViewItem.getTag(); 84 } 85 this.imageLoad.displayImage(this.imageUrls[position], 86 holder.imageView, options, 87 new SimpleImageLoadingListener() { 88 89 @Override 90 public void onLoadingStarted(String imageUri, View view) { 91 holder.progressBar.setProgress(0); 92 holder.progressBar.setVisibility(View.VISIBLE); 93 } 94 95 @Override 96 public void onLoadingFailed(String imageUri, View view, 97 FailReason failReason) { 98 holder.progressBar.setVisibility(View.GONE); 99 } 100 101 @Override 102 public void onLoadingComplete(String imageUri, 103 View view, Bitmap loadedImage) { 104 holder.progressBar.setVisibility(View.GONE); 105 } 106 107 }, new ImageLoadingProgressListener() { 108 109 @Override 110 public void onProgressUpdate(String imageUri, 111 View view, int current, int total) { 112 holder.progressBar.setProgress(Math.round(100.0f 113 * current / total)); 114 } 115 }); // 通过URL判断图片是否已经下载 116 return convertView; 117 } 118 119 } 120 }
复制代码

里面主要的对象都用        突出显示了。

三者的关系

ImageLoaderConfiguration是针对图片缓存的全局配置,主要有线程类、缓存大小、磁盘大小、图片下载与解析、日志方面的配置。

ImageLoader是具体下载图片,缓存图片,显示图片的具体执行类,它有两个具体的方法displayImage(...)、loadImage(...),但是其实最终他们的实现都是displayImage(...)。

DisplayImageOptions用于指导每一个Imageloader根据网络图片的状态(空白、下载错误、正在下载)显示对应的图片,是否将缓存加载到磁盘上,下载完后对图片进行怎么样的处理。

从三者的协作关系上看,他们有点像厨房规定、厨师、客户个人口味之间的关系。ImageLoaderConfiguration就像是厨房里面的规定,每一个厨师要怎么着装,要怎么保持厨房的干净,这是针对每一个厨师都适用的规定,而且不允许个性化改变。ImageLoader就像是具体做菜的厨师,负责具体菜谱的制作。DisplayImageOptions就像每个客户的偏好,根据客户是重口味还是清淡,每一个imageLoader根据DisplayImageOptions的要求具体执行。

 

ImageLoaderConfiguration

在上面的示例代码中,我们使用ImageLoaderConfiguration的默认配置,下面给出 ImageLoaderConfiguration比较详尽的配置,从下面的配置中,可以看出ImageLoaderConfiguration的配置主 要是全局性的配置,主要有线程类、缓存大小、磁盘大小、图片下载与解析、日志方面的配置。

复制代码
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context).memoryCacheExtraOptions(480, 800) // default = device screen dimensions.diskCacheExtraOptions(480, 800, null) .taskExecutor(...) .taskExecutorForCachedImages(...) .threadPoolSize(3) // default .threadPriority(Thread.NORM_PRIORITY - 1) // default .tasksProcessingOrder(QueueProcessingType.FIFO) // default  .denyCacheImageMultipleSizesInMemory() .memoryCache(new LruMemoryCache(2 * 1024 * 1024)) .memoryCacheSize(2 * 1024 * 1024) .memoryCacheSizePercentage(13) // default .diskCache(new UnlimitedDiscCache(cacheDir)) // default .diskCacheSize(50 * 1024 * 1024) .diskCacheFileCount(100) .diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default .imageDownloader(new BaseImageDownloader(context)) // default .imageDecoder(new BaseImageDecoder()) // default .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default  .writeDebugLogs() .build();
复制代码

ImageLoaderConfiguration的 主要职责就是记录相关的配置,它的内部其实就是一些字段的集合(如下面的源代码)。它有一个builder的内部类,这个类中的字段跟 ImageLoaderConfiguration中的字段完全一致,它有一些默认值,通过修改builder可以配置 ImageLoaderConfiguration。

View Code

 

 Display Options

每一个ImageLoader.displayImage(...)都可以使用Display Options

复制代码
DisplayImageOptions options = new DisplayImageOptions.Builder().showImageOnLoading(R.drawable.ic_stub) // resource or drawable.showImageForEmptyUri(R.drawable.ic_empty) // resource or drawable .showImageOnFail(R.drawable.ic_error) // resource or drawable .resetViewBeforeLoading(false) // default .delayBeforeLoading(1000) .cacheInMemory(false) // default .cacheOnDisk(false) // default  .preProcessor(...) .postProcessor(...) .extraForDownloader(...) .considerExifParams(false) // default .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default .bitmapConfig(Bitmap.Config.ARGB_8888) // default  .decodingOptions(...) .displayer(new SimpleBitmapDisplayer()) // default .handler(new Handler()) // default .build();
复制代码

 Display Options的主要职责就是记录相关的配置,它的内部其实就是一些字段的集合(如下面的源代码)。它有一个builder的内部类,这个类中的字段跟DisplayOption中的字段完全一致,它有一些默认值,通过修改builder可以配置DisplayOptions。

View Code

 

 

参考链接

http://blog.csdn.net/wangjinyu501/article/details/8091623

https://github.com/nostra13/Android-Universal-Image-Loader

http://www.intexsoft.com/blog/item/74-universal-image-loader-part-3.html


作者:kissazi2
出处:http://www.cnblogs.com/kissazi2/
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载于:https://www.cnblogs.com/1995hxt/p/4908145.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375444.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java小知识

内部类分为: 成员内部类、静态嵌套类、方法内部类、匿名内部类。(1)、内部类仍然是一个独立的类&#xff0c;在编译之后内部类会被编译成独立的.class文件&#xff0c;但是前面冠以外部类的类名和$符号。(2)、内部类不能用普通的方式访问。成员变量成员变量静态成员变量。List遍…

初识EL

一、EL函数库介绍 由于在JSP页面中显示数据时&#xff0c;经常需要对显示的字符串进行处理&#xff0c;SUN公司针对于一些常见处理定义了一套EL函数库供开发者使用。  这些EL函数在JSTL开发包中进行描述&#xff0c;因此在JSP页面中使用SUN公司的EL函数库&#xff0c;需要导入…

Scala学习笔记-环境搭建以及简单语法

关于环境的搭建&#xff0c;去官网下载JDK8和Scala的IDE就可以了&#xff0c;Scala的IDE是基于Eclipse的。 下面直接上代码&#xff1a; 这是项目目录&#xff1a; A是scala写的&#xff1a; package first import scala.collection.mutable.ListBufferobject A {def main(args…

UVa 12169 (枚举+扩展欧几里得) Disgruntled Judge

题意&#xff1a; 给出四个数T, a, b, x1,按公式生成序列 xi (a*xi-1 b) % 10001 (2 ≤ i ≤ 2T) 给出T和奇数项xi&#xff0c;输出偶数项xi 分析&#xff1a; 最简单的办法就是直接枚举a、b&#xff0c;看看与输入是否相符。 1 #include <cstdio>2 3 const int maxn …

【WCF安全】WCF 自定义授权[用户名+密码+x509证书]

1.x509证书制作(略) 2.直接贴代码 ----------------------------------------------------------------------服务端------------------------------------------------------------------------------------------- WCF服务 1 using System;2 using System.Collections.Generi…

ASP.NET Web API 数据提供系统相关类型及其关系

转载于:https://www.cnblogs.com/frankyou/p/4932651.html

openMVG跑自定义数据出错

使用自己拍摄的图片跑 openMVG 的 turtor_demo.py 时&#xff0c;出现错误&#xff0c;没有生成 sfm_data.bin DSC01988" model "DSC-RX100M6" doesnt exist in the database Please consider add your camera model and sensor width in the database.原因时数…

windows server 2003下安装iis6+php

参照http://www.myhack58.com/Article/sort099/sort0100/2012/35579.htm 这篇文章&#xff0c;即可&#xff01; 前 面我写了《windows安装PHP5.4Apache2.4Mysql5.5》的安装教程&#xff0c;本地实现是很简单的&#xff0c;但是有人还是喜欢用IIS来配置 PHP环境&#xff0c;部分…

winform自定义文件程序-- 不允许所请求的注册表访问权(ZSSQL)

常见问题1&#xff1a; 不允许所请求的注册表访问权 win7、win8 双击程序文件ZSSQL时候会出现 不允许所请求的注册表访问权 的弹窗异常 解决方法&#xff1a;ZSSQL.exe 右键 属性--兼容性--以管理员身份运行此程序 转载于:https://www.cnblogs.com/DemoLee/p/4173324.html

UITabBarController使用总结

刚看了几天教程就开始跟着开发了&#xff0c;以前也没学过C&#xff0c;太痛苦了~只能看看大神的博客&#xff0c;自己再总结学习一下了。 1.首先新建一个TabBarViewController继承于UITabBarController。然后什么都不用写&#xff0c;相当于装各个tab页的容器。 2.给每个视图都…

第一个 mac 程序 Create-JSON-Model

第一个 mac 程序 Create-JSON-Model 效果图 数据 {"ID":null,"name":"Doe","first-name":"John","age":25,"hobbies":["reading","cinema",{"sports":["volley-bal…

Android--简单开发和使用ContentProvider数据共享

今天学习的时候学到了ContentProvider数据共享这个东东&#xff0c;所以自己写了个小例子: 我们要开发ContentProvider的话&#xff0c;需要创建一个类去继承ContentProvider,里面会让你重写四个方法&#xff0c;这四个方法就是数据共享用到的方法 包括SQLite的插入、查询、删除…

ECharts数据图表系统? 5分钟上手!

目录&#xff1a; 前言简介方法一&#xff1a;模块化单文件引入(推荐)方法二&#xff1a;标签式单文件引入【前言】 最近在捣鼓各种插件各种框架&#xff0c;发现这个ECharts还是比较不错的&#xff0c;文档也挺全的&#xff0c;还是中文的&#xff0c;给大家推荐一下。 这篇文…

Solr-5.3.1安装配置

Solr-5.3.1安装配置官方网站:http://lucene.apache.org/solr/http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htmlhttp://lucene.apache.org/solr/quickstart.html环境:CentOS6 x64Solr-5.3.1从Solr5.0开始&#xff0c;Solr不再发布为在任何…

EF for Firebird

今天用了Firebird&#xff0c;记录下怎么用&#xff0c;不然下次给忘记了 1.官网下载包 1.DDEXProvider-3.0.1.0.msi 2.FirebirdSql.Data.FirebirdClient-4.6.2.0.msi 备注&#xff1a; 1.发现DDEXProvider 与 FirebirdSql.Data.FirebirdClient安装有先后顺序 1.如果中间出现了…

(接口)银联证书上传被修改的问题和读取证书的绝对路径问题

最近在做对接银联的支付接口。相对于支付宝、微信支付&#xff0c;银联支付接口应该是做的最完美的了。银联支付平台提供了足够详细的接口文档&#xff0c;接口demo&#xff0c;常见问题解决方案。 更人性化的是&#xff0c;个人可以免费注册一个商家账号&#xff0c;提供给你免…

MST:Bad Cowtractors(POJ 2377)

坏的牛圈建筑 题目大意&#xff1a;就是现在农夫又要牛修建牛栏了&#xff0c;但是农夫想不给钱&#xff0c;于是牛就想设计一个最大的花费的牛圈给他&#xff0c;牛圈的修理费用主要是用在连接牛圈上 这一题很简单了&#xff0c;就是找最大生成树&#xff0c;把Kruskal算法改一…

第4章 maven依赖特性

第4章 maven依赖特性 本章详细介绍maven的依赖特性和依赖范围&#xff0c;如何排除依赖。 4.1 什么是依赖传递 举个例子 在非maven项目中&#xff0c;你需要使用spring功能&#xff0c;你会想到导入spring的jar包&#xff0c;那么&#xff0c;srping又需要其他依赖jar包支持&a…

lintcode :Integer to Roman 整数转罗马数字

题目 整数转罗马数字 给定一个整数&#xff0c;将其转换成罗马数字。 返回的结果要求在1-3999的范围内。 样例 4 -> IV 12 -> XII 21 -> XXI 99 -> XCIX 更多案例&#xff0c;请戳 http://literacy.kent.edu/Minigrants/Cinci/romanchart.htm 说明 什么是 罗马数字…