1.功能概要

Android-Universal-Image-Loader是一个开源的UI组件程序,该项目的目的是提供一个可重复使用的仪器为异步图像加载,缓存和显示。

(1).使用多线程加载图片
(2).灵活配置ImageLoader的基本参数,包括线程数、缓存方式、图片显示选项等;
(3).图片异步加载缓存机制,包括内存缓存及SDCard缓存;
(4).采用监听器监听图片加载过程及相应事件的处理;
(5).配置加载的图片显示选项,比如图片的圆角处理及渐变动画。

2.简单实现

ImageLoader采用单例设计模式,ImageLoader imageLoader = ImageLoader.getInstance();得到该对象,每个ImageLoader采用单例设计模式,ImageLoader必须调用init()方法完成初始化。

  1. //  1.完成ImageLoaderConfiguration的配置
  2. ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this)
  3. .memoryCacheExtraOptions(480, 800)          // default = device screen dimensions
  4. .discCacheExtraOptions(480, 800, CompressFormat.JPEG, 75, null)
  5. .taskExecutor(...)
  6. .taskExecutorForCachedImages(...)
  7. .threadPoolSize(3)                          // default
  8. .threadPriority(Thread.NORM_PRIORITY - 1)   // default
  9. .tasksProcessingOrder(QueueProcessingType.FIFO) // default
  10. .denyCacheImageMultipleSizesInMemory()
  11. .memoryCache(new LruMemoryCache(2 * 1024 * 1024))
  12. .memoryCacheSize(2 * 1024 * 1024)
  13. .memoryCacheSizePercentage(13)              // default
  14. .discCache(new UnlimitedDiscCache(cacheDir))// default
  15. .discCacheSize(50 * 1024 * 1024)        // 缓冲大小
  16. .discCacheFileCount(100)                // 缓冲文件数目
  17. .discCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
  18. .imageDownloader(new BaseImageDownloader(context)) // default
  19. .imageDecoder(new BaseImageDecoder()) // default
  20. .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
  21. .writeDebugLogs()
  22. .build();
  23. //  2.单例ImageLoader类的初始化
  24. ImageLoader imageLoader = ImageLoader.getInstance();
  25. imageLoader.init(config);
  26. //  3.DisplayImageOptions实例对象的配置
  27. //      以下的设置再调用displayImage()有效,使用loadImage()无效
  28. DisplayImageOptions options = new DisplayImageOptions.Builder()
  29. .showStubImage(R.drawable.ic_stub)          // image在加载过程中,显示的图片
  30. .showImageForEmptyUri(R.drawable.ic_empty)  // empty URI时显示的图片
  31. .showImageOnFail(R.drawable.ic_error)       // 不是图片文件 显示图片
  32. .resetViewBeforeLoading(false)  // default
  33. .delayBeforeLoading(1000)
  34. .cacheInMemory(false)           // default 不缓存至内存
  35. .cacheOnDisc(false)             // default 不缓存至手机SDCard
  36. .preProcessor(...)
  37. .postProcessor(...)
  38. .extraForDownloader(...)
  39. .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)// default
  40. .bitmapConfig(Bitmap.Config.ARGB_8888)              // default
  41. .decodingOptions(...)
  42. .displayer(new SimpleBitmapDisplayer()) // default 可以设置动画,比如圆角或者渐变
  43. .handler(new Handler())                             // default
  44. .build();
  45. //  4图片加载
  46. //  4.1 调用displayImage
  47. imageLoader.displayImage(
  48. uri,        /*
  49. String imageUri = "http://site.com/image.png";      // from Web
  50. String imageUri = "file:///mnt/sdcard/image.png";   // from SD card
  51. String imageUri = "content://media/external/audio/albumart/13"; // from content provider
  52. String imageUri = "assets://image.png";             // from assets
  53. */
  54. imageView,      // 对应的imageView控件
  55. options);       // 与之对应的image显示方式选项
  56. //  4.2 调用loadImage
  57. //      对于部分DisplayImageOptions对象的设置不起作用
  58. imageLoader.loadImage(
  59. uri,
  60. options,
  61. new MyImageListener()); //ImageLoadingListener
  62. class MyImageListener extends SimpleImageLoadingListener{
  63. @Override
  64. public void onLoadingStarted(String imageUri, View view) {
  65. imageView.setImageResource(R.drawable.loading);
  66. super.onLoadingStarted(imageUri, view);
  67. }
  68. @Override
  69. public void onLoadingFailed(String imageUri, View view,
  70. FailReason failReason) {
  71. imageView.setImageResource(R.drawable.no_pic);
  72. super.onLoadingFailed(imageUri, view, failReason);
  73. }
  74. @Override
  75. public void onLoadingComplete(String imageUri, View view,
  76. Bitmap loadedImage) {
  77. imageView.setImageBitmap(loadedImage);
  78. super.onLoadingComplete(imageUri, view, loadedImage);
  79. }
  80. @Override
  81. public void onLoadingCancelled(String imageUri, View view) {
  82. imageView.setImageResource(R.drawable.cancel);
  83. super.onLoadingCancelled(imageUri, view);
  84. }
  85. }

3.支持的Uri

  1. String imageUri = "http://site.com/image.png";      // from Web
  2. String imageUri = "file:///mnt/sdcard/image.png";   // from SD card
  3. String imageUri = "content://media/external/audio/albumart/13"; // from content provider
  4. String imageUri = "assets://image.png";             // from assets
  5. String imageUri = "drawable://" + R.drawable.image; // from drawables (only images, non-9patch)

加载drawables下图片,可以通过ImageView.setImageResource(...) 而不是通过上面的ImageLoader.

4.缓冲至手机

默认不能保存缓存,必须通过下面的方式指定

  1. DisplayImageOptions options = new DisplayImageOptions.Builder()
  2. ...
  3. .cacheInMemory(true)
  4. .cacheOnDisc(true)
  5. ...
  6. .build();
  7. ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
  8. ...
  9. .defaultDisplayImageOptions(options)
  10. ...
  11. .build();
  12. ImageLoader.getInstance().init(config); // Do it on Application start
  13. ImageLoader.getInstance().displayImage(imageUrl, imageView);    /*
  14. 默认为defaultDisplayImageOptions设定的options对象,此处不用指定options对象 */

或者通过下面这种方式

  1. DisplayImageOptions options = new DisplayImageOptions.Builder()
  2. ...
  3. .cacheInMemory(true)
  4. .cacheOnDisc(true)
  5. ...
  6. .build();
  7. ImageLoader.getInstance().displayImage(imageUrl, imageView, options); //此处指定options对象

由于缓存需要在外设中写入数据,故需要添加下面的权限

  1. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

5.OutOfMemoryError

如果OutOfMemoryError错误很常见,可以通过下面的方式设置
(1).减少configuration中线程池的线程数目(.threadPoolSize(...)) 推荐为1 - 5
(2).display options通过.bitmapConfig(Bitmap.Config.RGB_565)设置. Bitmaps in RGB_565 consume 2 times less memory than in ARGB_8888.
(3).使用configuration的memoryCache(new WeakMemoryCache())方法 或者不调用.cacheInMemory()方法
(4).display options通过.imageScaleType(ImageScaleType.IN_SAMPLE_INT) 或者 .imageScaleType(ImageScaleType.EXACTLY)方法
(4).避免使用RoundedBitmapDisplayer,它创建了一个新的ARGB_8888 Bitmap对象

6.内存缓存管理

通过imageLoaderConfiguration.memoryCache([new LruMemoryCache(1)]))对手机内存缓存进行管理

LruMemoryCache

API >= 9默认.it is moved to the head of a queue.

FreqLimitedMemoryCache

当超过缓存大小后,删除最近频繁使用的bitmap

LRULimitedMemoryCache

API < 9 默认.当超过缓存大小后,删除最近使用的bitmap

FIFOLimitedMemoryCache

FIFO rule is used for deletion when cache size limit is exceeded

LargestLimitedMemoryCache

The largest bitmap is deleted when cache size limit is exceeded

WeakMemoryCache

Unlimited cache

7.SDcard缓存管理

通过imageLoaderConfiguration.discCache([new TotalSizeLimitedDiscCache()]))对SD卡缓存进行管理

UnlimitedDiscCache

default The fastest cache, doesn't limit cache size

TotalSizeLimitedDiscCache

Cache limited by total cache size. If cache size exceeds specified limit then file with themost oldest lastusage date will be deleted

FileCountLimitedDiscCache

Cache limited by file count. If file count in cache directory exceeds specified limit then file with the most oldest last usage date will be deleted.

LimitedAgeDiscCache

Size-unlimited cache with limited files' lifetime. If age of cached file exceeds defined limit then it will be deleted from cache.

UnlimitedDiscCache is 30%-faster than other limited disc cache implementations.

ImageLoader简介和使用方法的更多相关文章

  1. NetCat简介与使用方法

    精品学习网考试频道小编应广大考生的需要,特为参加考试的考生策划了“NetCat简介与使用方法”专题等有关资料,供考生参考! 在入侵中它是最经典的工具之一 ,NetCat被所有的网络安全爱好者和研究者称 ...

  2. PHP Socket(套接字连接)扩展简介和使用方法

    PHP socket扩展是基于流行的BSD sockets,实现了和socket通讯功能的底层接口,它可以和客户端一样当做一个socket服务器. 使用这些函数时请注意,虽然他们中有很多和C函数同名的 ...

  3. nc之一:NetCat简介与使用方法

    精品学习网考试频道小编应广大考生的需要,特为参加考试的考生策划了“NetCat简介与使用方法”专题等有关资料,供考生参考! 在入侵中它是最经典的工具之一 ,NetCat被所有的网络安全爱好者和研究者称 ...

  4. git简介及使用方法

    一.git简介及安装1.git简介 Git 是用于 Linux 内核开发的版本控制工具.与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持, ...

  5. Retrofit简介与使用方法(翻译)

    简介 Retrofit 是一个Square开发的类型安全的REST安卓客户端请求库.这个库为网络认证.API请求以及用OkHttp发送网络请求提供了强大的框架.Retrofit库让从web api下载 ...

  6. JavaScript简介与使用方法

    1.JavaScript简介 1.1.JavaScript简史 最初:网络通信很慢,网页上的数据要传送到数据库验证,然后再返回错误结果,找客观过程要等很久,于是,网景公司开发出一门新语言,当时Java ...

  7. SAP Web Service简介与配置方法

    [版权声明]本文为博主原创文章,转载请在明显位置注明出处. 一. SAP Web Service简介 二. SAP Web Service配置准备工作 1. 通过RZ10配置服务器名称和其他参数 2. ...

  8. Afinal简介和使用方法

    Afinal简介 Afinal 是一个android的sqlite orm 和 ioc 框架.同时封装了android中的http框架,使其更加简单易用: 使用finalBitmap,无需考虑bitm ...

  9. xUtils简介和使用方法

    xUtils简介 xUtils 包含了很多实用的android工具. xUtils 最初源于Afinal框架,进行了大量重构,使得xUtils支持大文件上传,更全面的http请求协议支持(10种谓词) ...

随机推荐

  1. 【小白学PyTorch】12 SENet详解及PyTorch实现

    文章来自微信公众号[机器学习炼丹术].我是炼丹兄,有什么问题都可以来找我交流,近期建立了微信交流群,也在朋友圈抽奖赠书十多本了.我的微信是cyx645016617,欢迎各位朋友. 参考目录: @ 目录 ...

  2. Apache Hudi和Presto的前世今生

    一篇由Apache Hudi PMC Bhavani Sudha Saktheeswaran和AWS Presto团队工程师Brandon Scheller分享Apache Hudi和Presto集成 ...

  3. 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统二 | 简单的分库分表设计

    教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 06 | 最终篇-通过AOP自动连接数据库-完成日志业 ...

  4. javaweb开发中的常见错误

    Javaweb中的最常见错误及其解决方法 1.200:表示成功处理业务. 2.400 请求出错: 由于语法格式有误,服务器无法理解此请求.不作修改,客户程序就 无法重复此请求. 解决办法:,遇到400 ...

  5. python中yield的用法详解——最简单,最清晰的解释(转载)

    原文链接 首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的, ...

  6. ISCC2018 writeup(web)

    比较数字大小 F12 修改maxlength为4 web01 strcmp()函数遇到数组会返回NULL 而PHP是弱类型语言  在==比较的时候,如果有数值的话会先将字符串转换为数值在进行比较,而N ...

  7. Java Comparable 和 Comparator 接口详解

    本文基于 JDK8 分析 Comparable Comparable 接口位于 java.lang 包下,Comparable 接口下有一个 compareTo 方法,称为自然比较方法.一个类只要实现 ...

  8. 拉格朗日乘子法 Lagrange multipliers

  9. IO那些事

    IO(Input\Output): 即输入输出,通常指数据在存储器(内部和外部)或其他周边设备之间的输入和输出,是信息处理系统(例如计算机)与外部世界(可能是人类或另一信息处理系统)之间的通信.说的简 ...

  10. Android Studio3.5在编译项目出现连接不上gradle该怎么办?

    ------------恢复内容开始------------ 报错原因: Could not get resource 'https://dl.google.com/dl/android/maven2 ...