ImageLoader类中包含了所有操作。他是一个单例,为了获取它的一个单一实例,你需要调用getInstance()方法。在使用 ImageLoader来显示图片之前,你需要初始化它的配置-ImageLoaderConfiguration使用init(…)方法。然后,你就可 以使用可以明确地根据需要使用不同形式的displayImage(…)。

总之,ImageLoader最简单的用法如下所示(使用默认配置):

ImageView imageView = ... // view, where the image will be displayed
String imageUrl = ... // image URL (e.g. "http://site.com/image.png", "file:///mnt/sdcard/img/image.jpg")
ImageLoader imageLoader = ImageLoader.getInstance();
imageLoader.init(ImageLoaderConfiguration .createDefault(context));
imageLoader.displayImage(imageUrl, imageView);

现在,让我们看看完整的用法。

就像你已经知道的,我们首先需要用configuration对象来初始化ImageLoader。因为ImageLoader是一个单例,所以它 需要在App一启动的时候就初始化。我建议在一个重载了了的Application.onCreate()来做这件事。对于一个已经初始化的 ImageLoader,重新初始化将不会对程序有任何影响。

接下来,我们创建一个configuration,他是一个ImageLoaderConfiguration类的对象,我们使用Builder来创建它。

File cacheDir = StorageUtils.getCacheDirectory(context,"UniversalImageLoader/Cache");

ImageLoaderConfiguration config = new ImageLoaderConfiguration .Builder(getApplicationContext())
  .maxImageWidthForMemoryCache(800)
  .maxImageHeightForMemoryCache(480)
  .httpConnectTimeout(5000)
  .httpReadTimeout(20000)
  .threadPoolSize(5)
  .threadPriority(Thread.MIN_PRIORITY + 3)
  .denyCacheImageMultipleSizesInMemory()
  .memoryCache(new UsingFreqLimitedCache(2000000)) // You can pass your own memory cache implementation
  .discCache(new UnlimitedDiscCache(cacheDir)) // You can pass your own disc cache implementation
  .defaultDisplayImageOptions(DisplayImageOptions.createSimple())
  .build();

下面让我们来看看每一个选项。

• maxImageWidthForMemoryCache() 和maxImageHeightForMemoryCache()用于将图片解析成Bitmap对象。为了不储存整个图片,根据ImageView 参数的值(要加载图片的那个)减少图片的大小。maxWidth和maxHeight(第一阶段),layout_width layout_height(第二阶段)。如果不定义这些参数(值为fill_parent和    wrap_content被视为不确定的大小),然后尺寸的 设定就会根据maxImageWidthForMemoryCache()和maxImageHeightForMemoryCache()的设置而定。 原始图像的大小最大会缩小到2倍(适合用fast decoding),直到宽度或高度变得小于指定值;

o默认值 - 设备的屏幕大小

• httpReadTimeout()设置图片从网络中加载的最大超时时间(以毫秒为单位)

o 默认值- 30秒

• threadPoolSize() 设置线程池的大小. 每一个图片加载和显示的任务都是在一个个单独的线程中进行的,这些线程在从图片网络中被下载的时候就会进入线程池。因此,池的大小决定能同时运行的线程 数。一个大的线程池能显著地拖慢UI的响应速度,例如,列表的滚动就会变慢.
o 默认值- 5

• threadPriority()设置正在运行任务的所有线程在系统中的优先级(1到10);

o默认值- 4


调用denyCacheImageMultipleSizesInMemory()强制UIL在内存中不能存储内容相同但大小不同的图像。由于完整大小的
图片会存储在磁盘缓存中,后面当图片加载进入内存,他们就会缩小到ImageView的大小(图片要显示的尺寸),然而在某些情况下,相同的图像第一次显
示在一个小的View中,然后又需要在一个大的View中显示。同时,两个不同大小的相同内容的图片就会被将被存储在内存中。这是默认的操作。
denyCacheImageMultipleSizesInMemory()指令确保删除前一个加载的图像缓存的内存的大小

• 使用memoryCache(),你可以指定内存缓存的实现。你可以使用现成的解决方案(他们都是实现limited  size-cache,如果超过缓存大小,就通过一定算法删除一个对象):

o FIFOLimitedCache (根据先进先出的原则上删除多余对象)
o LargestLimitedCache (空间占用最大的对象会被删除)
o UsingAgeLimitedCache (最早被添加的对象会被删除)
o UsingFreqLimitedCache (最少被用到的对象会被删除)
或者,你可以实现通过实现接口MemoryCacheAware <String,Bitmap>来实现自己的缓存;
o 默认值 - 使用2 MB的内存限制的UsingFreqLimitedCache
memoryCacheSize() 设置内存缓存的最大占用空间. 在这种情况下,默认的缓存策略是 - UsingFreqLimitedCache.
o 默认值 - 2 MB

• Using discCache(), 你可以定义自己的磁盘缓存. 也可以现成的解决方案 (文件跟特定的URL匹配,文件名为这些URL的哈希值):

o UnlimitedDiscCache (通常的策略, 缓存大小没有限制)
o FileCountLimitedDiscCache (限定大小的缓存)
o TotalSizeLimitedDiscCache (限定文件个数的缓存策略)
另外,你也可以通过实现DiscCacheAware接口定义自己的缓存
o 默认值 - UnlimitedDiscCache

• 使用defaultDisplayImageOptions(),你可以设置image显示选项,如果自定义选项没有传递给displayImage(),它将用于displayimage(…)方法的每一次调用。下面,我将详细讨论这些选项。

我们可以构建一个configuration对象或信任一个开发人员(比如我)然后使用默认的configuration:

ImageLoaderConfiguration config = ImageLoaderConfiguration.createDefault(context);

因此,configuration就创建好了。现在,ImageLoader可以通过它初始化了:

ImageLoader.getInstance().init(config);

【开源项目9】ImageLoaderConfiguration详解的更多相关文章

  1. TortoiseGit学习系列之TortoiseGit基本操作拉取项目(图文详解)

    前面博客 TortoiseGit学习系列之TortoiseGit基本操作克隆项目(图文详解) TortoiseGit学习系列之TortoiseGit基本操作修改提交项目(图文详解) TortoiseG ...

  2. TortoiseGit学习系列之TortoiseGit基本操作修改提交项目(图文详解)

    前面博客 TortoiseGit学习系列之TortoiseGit基本操作克隆项目(图文详解) TortoiseGit基本操作修改提交项目 项目克隆完成后(可以将克隆 clone 理解为 下载,检出 c ...

  3. Git学习系列之Git基本操作拉取项目(图文详解)

    前面博客 Git学习系列之Git基本操作推送项目(图文详解) 当然,如果多人协作,或者多个客户端进行修改,那么我们还要拉取(Pull ... )别人推送到在线仓库的内容下来. 大神们是不推荐使用 pu ...

  4. Git学习系列之Git基本操作推送项目(图文详解)

    前面博客 Git学习系列之Git基本操作提交项目(图文详解) 如果完成到一定程度,那么可以推送到远端在线仓库. 推送之前,请确保你已经设置了全局的 user.name 和 user.email, 如果 ...

  5. Git学习系列之Git基本操作提交项目(图文详解)

    前面博客 Git学习系列之Git基本操作克隆项目(图文详解) 然后可以 cd 切换到 LispGentleIntro 目录, 新增或者修改某些文件.这里只是模拟一下操作, 实际情况可能是 使用 Ecl ...

  6. Angular-cli新建项目目录结构详解

    Angular-cli新建项目目录结构详解 在上一篇博客中我们已经通过Angular CLI命令行工具创建出来一个全新的Angular项目,要想写项目,首先我们要先搞清楚项目的目录结构是怎样的,每个文 ...

  7. vue-cli3.0 脚手架搭建项目的过程详解

    1.安装vue-cli 3.0 ? 1 2 3 npm install -g @vue/cli # or yarn global add @vue/cli 安装成功后查看版本:vue -V(大写的V) ...

  8. App域名劫持之DNS高可用 - 开源版HttpDNS方案详解(转)

      http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=209805123&idx=1&sn=ced8d67c3e2cc3 ...

  9. TortoiseGit学习系列之TortoiseGit基本操作克隆项目(图文详解)

    前面博客 全网最详细的Git学习系列之介绍各个Git图形客户端(Windows.Linux.Mac系统皆适用ing)(图文详解) 全网最详细的Git学习系列之安装各个Git图形客户端(Windows. ...

  10. Git学习系列之Git基本操作克隆项目(图文详解)

    不多说,直接上干货! 想必,能进来看我写的这篇博文的朋友,肯定是了解过. 比如SVN的操作吧,最常见的是 检出(Check out ...), 更新 (Update ...), 以及 提交(Commi ...

随机推荐

  1. JavaIO(06)文件复制

    文件复制一般是采用两种方式进行操作: 1:将源文件中的内容全部读取到内存中,并一次性的写入到目标文件中:(不常用这种方式) 2:不将源文件中的内容全部读取进来,而是采用边读边写的方式:   实例01: ...

  2. 【原创】用Pwnage + Redsnow 制作完美越狱固件

    原帖我发表在威锋论坛 现在貌似IOS 7.X系 大行其道,就算不是IOS7.X ,很多人也装着IOS 6.X系. 进入正文前首先介绍一下自己目前的"环境" 设备:iphone4 G ...

  3. PyQt多窗口调用

    经常有人问到如何在一个主窗口中打开一个对话框,然后在确认对话框之后,开启另一个窗口进行后续操作,要求主窗口和最终的窗口之间都能响应用户操作,也就是非模态窗口.随手写了几行代码,简要示意. :::pyt ...

  4. IOC知识

    1.两个基本概念 IOC(Inversion of Control ):反转控制,即将控制权反转出去. DI(Dependency Injection):依赖注入,根据依赖关系进行注入. DI是实现I ...

  5. UVa 1617 Laptop (贪心)

    题意:有n个长度为1的线段,确定它们的起点,使得第i个线段在[ri,di]之间,输出空隙数目的最小值. 析:很明显的贪心题,贪心策略是这样的,先把所有的区间排序,原则是按右端点进行排序,如果相等再按左 ...

  6. 计数排序详解以及java实现

    前言 我们知道,通过比较两个数大小来进行排序的算法(比如插入排序,合并排序,以及上文提到的快速排序等)的时间复杂度至少是Θ(nlgn),这是因为比较排序对应的决策树的高度至少是Θ(nlgn),所以排序 ...

  7. CString 转 char*; wstring 转 string

    1. CString  转 char* ); CString name; name.Format(_T("bookUC%d.txt"),m_ID); std::wstring _n ...

  8. 关于mysql函数GROUP_CONCAT

    GROUP_CONCAT()是MySQL数据库提供的一个函数,通常跟GROUP BY一起用,具体可参考MySQL官方文挡:http://dev.mysql.com/doc/refman/5.0/en/ ...

  9. PostgreSQL中的AnyEnum例子

    建立函数: CREATE OR REPLACE FUNCTION enumtest(anyenum) RETURNS text AS $$ ::text; $$ LANGUAGE SQL; 建立enu ...

  10. C++学习笔记之字符函数库cctype

    C++从C语言继承了一个与字符相关的.非常方便的函数软件包,它可以简化诸如确定字符是否为大写字母.数字.标点符号等工作,这些函数原型是在头文件cctype(老式风格ctype.h)中定义的. 下表对这 ...