Android开源库--Universal Image Loader通用图片加载器

时间:2022-08-27 08:44:38

如果说我比别人看得更远些,那是因为我站在了巨人的肩上。

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

介绍:

UIL致力于提供一个强大、灵活、高度可定制化工具来加载、缓存以及显示图片。它提供了许多配置选项和图像加载、缓存过程中的控制。
Android开源库--Universal Image Loader通用图片加载器
↑工作流程图
 

特点:

1、多线程图片加载(同步或者异步)
2、大部分可定制的配置(线程执行,下载器,解码器,内存或磁盘缓存,显示图片选项等等)
3、每个图片显示的调用都可以使用不同的配置。
4、将图片缓存再内存或磁盘(设备文件系统或SD卡)
5、监听加载过程(包括下载过程)
需要Android2.0+的支持。
 

设置:

1、下载官方JAR
2、将JAR文件放到项目的lib文件夹即可。
3、添加用户权限
网络权限,外部存储写权限
  1. <manifest>
  2. <!-- Include following permission if you load images from Internet -->
  3. <uses-permissionandroid:name="android.permission.INTERNET"/>
  4. <!-- Include following permission if you want to cache images on SD card -->
  5. <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  6. ...
  7. </manifest>
4、在第一次使用之前初始化图片加载器(一般我们写在Application的onCrate里)
  1. publicclassMyActivityextendsActivity{
  2. @Override
  3. publicvoid onCreate(){
  4. super.onCreate();
  5. // Create global configuration and initialize ImageLoader with this config
  6. ImageLoaderConfiguration config =newImageLoaderConfiguration.Builder(this)
  7. ...
  8. .build();
  9. ImageLoader.getInstance().init(config);
  10. ...
  11. }
  12. }
5、配置与现实选项的区别
  • ImageLoader Configuration (ImageLoaderConfiguration) 对应用来说是全局的.
  • Display Options (DisplayImageOptions) 对每一个显示作业都是本地的 (ImageLoader.displayImage(...)).
Configuration
  1. // DON'T COPY THIS CODE TO YOUR PROJECT! This is just example of ALL options using.
  2. // See the sample project how to use ImageLoader correctly.
  3. File cacheDir =StorageUtils.getCacheDirectory(context);
  4. ImageLoaderConfiguration config =newImageLoaderConfiguration.Builder(context)
  5. .memoryCacheExtraOptions(480,800)// 默认 = 设备屏幕大小
  6. .diskCacheExtraOptions(480,800,null)
  7. .taskExecutor(...)
  8. .taskExecutorForCachedImages(...)
  9. .threadPoolSize(3)// default
  10. .threadPriority(Thread.NORM_PRIORITY -2)// default
  11. .tasksProcessingOrder(QueueProcessingType.FIFO)// default
  12. .denyCacheImageMultipleSizesInMemory()
  13. .memoryCache(newLruMemoryCache(2*1024*1024))
  14. .memoryCacheSize(2*1024*1024)
  15. .memoryCacheSizePercentage(13)// default
  16. .diskCache(newUnlimitedDiscCache(cacheDir))// default
  17. .diskCacheSize(50*1024*1024)
  18. .diskCacheFileCount(100)
  19. .diskCacheFileNameGenerator(newHashCodeFileNameGenerator())// default
  20. .imageDownloader(newBaseImageDownloader(context))// default
  21. .imageDecoder(newBaseImageDecoder())// default
  22. .defaultDisplayImageOptions(DisplayImageOptions.createSimple())// default
  23. .writeDebugLogs()
  24. .build();
Display Options
注意:如果现实图片的时候没有传入该参数,则将默认使用Configuration(ImageLoaderConfiguration.defaultDisplayImageOptions(...))的配置。
  1. // DON'T COPY THIS CODE TO YOUR PROJECT! This is just example of ALL options using.
  2. // See the sample project how to use ImageLoader correctly.
  3. DisplayImageOptions options =newDisplayImageOptions.Builder()
  4. .showImageOnLoading(R.drawable.ic_stub)// resource or drawable
  5. .showImageForEmptyUri(R.drawable.ic_empty)// resource or drawable
  6. .showImageOnFail(R.drawable.ic_error)// resource or drawable
  7. .resetViewBeforeLoading(false)// default
  8. .delayBeforeLoading(1000)
  9. .cacheInMemory(false)// default
  10. .cacheOnDisk(false)// default
  11. .preProcessor(...)
  12. .postProcessor(...)
  13. .extraForDownloader(...)
  14. .considerExifParams(false)// default
  15. .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)// default
  16. .bitmapConfig(Bitmap.Config.ARGB_8888)// default
  17. .decodingOptions(...)
  18. .displayer(newSimpleBitmapDisplayer())// default
  19. .handler(newHandler())// default
  20. .build();
 

使用:

允许加载的URLs示例
"http://site.com/image.png" // 从网络读取
"file:///mnt/sdcard/image.png" // 从sd卡读取
"file:///mnt/sdcard/video.mp4" // 从sd卡读取(视频缩略图)
"content://media/external/images/media/13" // 从内容供应者加载
"content://media/external/video/media/13" // 从内容供应者加载(视频缩略图)
"assets://image.png" // 从assets(资产读取)
"drawable://" + R.drawable.img //从绘图读取(不包括.9.png)
 

示例:

  1. //加载图片,解码成bitmap并且在ImageView显示(或者任何实现了ImageAware接口的View)
    imageLoader.displayImage(imageUri, imageView);
    // 加载图片,解码成bitmap并且以回调的形式返回bitmap
    imageLoader.loadImage(imageUri,newSimpleImageLoadingListener(){
    @Override
    publicvoid onLoadingComplete(String imageUri,View view,Bitmap loadedImage){
    // Do whatever you want with Bitmap
    }
    });
    // 加载图片,解码成bitmap并且同步返回bitmap
    Bitmap bmp = imageLoader.loadImageSync(imageUri);
    完整的
    // Load image, decode it to Bitmap and display Bitmap in ImageView (or any other view
    // which implements ImageAware interface)
    imageLoader.displayImage(imageUri, imageView, options,newImageLoadingListener(){
    @Override
    publicvoid onLoadingStarted(String imageUri,View view){
    ...
    }
    @Override
    publicvoid onLoadingFailed(String imageUri,View view,FailReason failReason){
    ...
    }
    @Override
    publicvoid onLoadingComplete(String imageUri,View view,Bitmap loadedImage){
    ...
    }
    @Override
    publicvoid onLoadingCancelled(String imageUri,View view){
    ...
    }
    },newImageLoadingProgressListener(){
    @Override
    publicvoid onProgressUpdate(String imageUri,View view,int current,int total){
    ...
    }
    });
    // Load image, decode it to Bitmap and return Bitmap to callback
    ImageSize targetSize =newImageSize(80,50);// 返回的图片将以被调整成该大小
    imageLoader.loadImage(imageUri, targetSize, options,newSimpleImageLoadingListener(){
    @Override
    publicvoid onLoadingComplete(String imageUri,View view,Bitmap loadedImage){
    // Do whatever you want with Bitmap
    }
    });
    // Load image, decode it to Bitmap and return Bitmap synchronously
    ImageSize targetSize =newImageSize(80,50);// result Bitmap will be fit to this size
    Bitmap bmp = imageLoader.loadImageSync(imageUri, targetSize, options);
 
 

注意:

1、建议直接使用ImageView.SetImageResource()来替代使用ImageLoader
 
2、缓存默认是不打开的,如果你要打开缓存,则需要在代码中声明
  1. // Create default options which will be used for every
  2. // displayImage(...) call if no options will be passed to this method
  3. DisplayImageOptions defaultOptions =newDisplayImageOptions.Builder()
  4. ...
  5. .cacheInMemory(true)
  6. .cacheOnDisk(true)
  7. ...
  8. .build();
  9. ImageLoaderConfiguration config =newImageLoaderConfiguration.Builder(getApplicationContext())
  10. ...
  11. .defaultDisplayImageOptions(defaultOptions)
  12. ...
  13. .build();
  14. ImageLoader.getInstance().init(config);// Do it on Application start
  15. // Then later, when you want to display image
  16. ImageLoader.getInstance().displayImage(imageUrl, imageView);// Default options will be used
或者这样
  1. DisplayImageOptions options =newDisplayImageOptions.Builder()
  2. ...
  3. .cacheInMemory(true)
  4. .cacheOnDisk(true)
  5. ...
  6. .build();
  7. ImageLoader.getInstance().displayImage(imageUrl, imageView, options);// Incoming options will be used
3、如果你开启了磁盘缓存,UIL尝试将图片缓存到外部存储(/sdcard/Android/data/[package_name]/cache).如果外部存储不存在,则会缓存到设备文件系统,记得要声明用户权限哟
 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />
4、UIL如何声明精确的ImageView所需的bitmap的大小?它将搜索以下参数
  • 获取ImageView实际测量的width和height。
  • 获取android:layout_width 和android:layout_height 参数。
  • 获取android:maxWidth 和/或 android:maxHeight 参数。
  • 从configuration (memoryCacheExtraOptions(int, int) option)获取最大的width 和/或 height 参数。
  • 获取设备屏幕的width和/或height
所以,如果你知道大概ImageView的大概最大尺寸,就尝试为其设置android:layout_width|android:layout_height 或android:maxWidth|android:maxHeight 参数。
 
5、如果你在使用UIL过程中经常报错OutOfMemoryError(内存溢出),尝试如下方法
  • 禁止内存缓存,如果依然OOM,那么检查你的APP是否存在内存泄露,使用MemoryAnalyzer检测一下。
  • 在configuration配置中减少线程池大小(.threadPoolSize(...)). 建议在1 - 5 之间。
  • 在display options中使用.bitmapConfig(Bitmap.Config.RGB_565)。Bitmaps在RGB_565下比ARGB_8888消耗少2被的内存。
  • 使用.imageScaleType(ImageScaleType.EXACTLY)
  • 在configuration配置中使用.diskCacheExtraOptions(480, 320, null)。
6、为了使用Cache内存缓存配置,(ImageLoaderConfiguration.memoryCache(...)),你可以直接使用已经实现的类。
  • 仅使用强引用的Cache缓存:
    • LruMemoryCache (当超过缓存大小时,删除最近最少使用的bitmap) - 默认使用
  • 使用弱和强引用的缓存:
    • UsingFreqLimitedMemoryCache (当超过缓存大小时,删除最不经常使用的bitmap)
    • LRULimitedMemoryCache (当超过缓存大小时,删除最近最少使用的bitmap)
    • FIFOLimitedMemoryCache (当超过缓存大小时,最先缓存的bitmap先删除。)
    • LargestLimitedMemoryCache (当超过缓存大小时,最大的Bitmap先删除。)
    • LimitedAgeMemoryCache (通过装饰,超过设置时限的bitmap将被删除)
  • 仅使用弱引用的缓存:
    • WeakMemoryCache (无限制缓存)
7、为了使用disk 磁盘缓存配置 (ImageLoaderConfiguration.diskCache(...)),你可以直接使用已经实现的类。
  • UnlimitedDiscCache (最快的缓存, 没有限制缓存大小) - 默认使用。
  • LruDiskCache (通过文件数量和最大缓存大小来限制缓存. 如果超过了限制,将会删除最近最少使用的文件)
  • LimitedAgeDiscCache (没有大小限制,但有时间限制的缓存. 如果时间超过了设定值,文件将被删除)
提示:UnlimitedDiscCache真的要你其他的实现要快的多哟!
 
8、你可以通过使用以实现的类来显示bitmap,(DisplayImageOptions.displayer(...))
  • RoundedBitmapDisplayer (显示带有圆角的图片)
  • FadeInBitmapDisplayer (显示带有淡入动画的图片)
 
9、为了避免list(grid..)滑动延迟,你可以使用PauseOnScrollListener
  1. boolean pauseOnScroll =false;// or true
  2. boolean pauseOnFling =true;// or false
  3. PauseOnScrollListener listener =newPauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling);
  4. listView.setOnScrollListener(listener);
10、如果你在image Url的尾部看到了一些奇怪的填充(例如http://anysite.com/images/image.png_230x460),那么这代表该Url不是一个request请求。而仅仅是"URL + 目标大小",这也是bitmap在内存缓存中的键,尾部的 (_230x460)不是用于请求的。
 
11、ImageLoader总是保持着图片的纵横比。

Android开源库--Universal Image Loader通用图片加载器的更多相关文章

  1. Android中用URL模拟一个简单的图片加载器

    首先,需要添加权限. <uses-permission android:name="android.permission.INTERNET"/> 整体代码如下: pac ...

  2. 通用图片加载组件UniversalImageLoader

    通用图片加载组件UniversalImageLoader   UniversalImageLoader是一款通用图片加载组件.该组件支持多种图片来源,如网络.SD卡.Assets文件夹等.在网络请求的 ...

  3. 14&period; Android框架和工具之 ImageLoader(图片加载)

    1. 这个图片加载框架网友很多都已经使用过,而且分析也很到位,这里我就不写了,直接引用别人,尊重别人的劳动成果. 2. 参考如下: (1)Android 开源框架Universal-Image-Loa ...

  4. Android 框架修炼-自己开发高效异步图片加载框架

    一.概述 目前为止,第三方的图片加载框架挺多的,比如UIL , Volley Imageloader等等.但是最好能知道实现原理,所以下面就来看看设计并开发一个加载网络.本地的图片框架. 总所周知,图 ...

  5. CI框架 -- 核心文件 之 Loader&period;php(加载器)

    顾名思义,装载器就是加载元素的,使用CI时,经常加载的有: 加载类库文件:$this->load->library()   加载视图文件:$this->load->view() ...

  6. 操作系统的 (program)loader(程序加载器)

    在计算机科学中,加载器(也叫程序加载器)属于操作系统的一部分,用于加载程序(programs)和库(libraries).加载器是执行程序和代码必不可少的组件,正是它负责将程序送入内存,为程序的运行提 ...

  7. 高性能异步图片加载器的JS库:lazysizes

    <script src="lazysizes.min.js" async=""></script> 使用示例 <!-- non-r ...

  8. Module loader:模块加载器

    <p data-height="265" data-theme-id="0" data-slug-hash="XpqRmq" data ...

  9. Android Fresco &lpar;Facebook开源的图片加载管理库&rpar;

    Fresco是Facebook开源的一个图片加载和管理库. 这里是Fresco的GitHub网址. 同类型的开源库市面有非常多,比如Picasso, Universal Image Loader, G ...

随机推荐

  1. 系列篇&vert;编译可在Android上运行的依赖库(一):glib库

    前言 这是系列文章,它们由<编译可在Android上运行的glib库>及其他4篇文章组成,这4篇文章在“编译依赖库”一节中列出.由于glib库依赖于其他第三方库,所以需要先将依赖的第三方库 ...

  2. 微软要支持Objective-C了

    今天的新闻,见http://www.solidot.org/story?sid=43899 更详细的见,http://arstechnica.com/information-technology/20 ...

  3. 侧滑菜单SlidingMenu

    想要使用SlidingMenu 需要下载文件SlidingMenu-master 并导入SlidingMenu-master中的第三方library 如图所示: 修改library里的build.gr ...

  4. 十、C&num; 异常处理

    1.多异常类型 2.捕捉异常 3.常规catch块 4.异常处理的指导原则 5.定义自定义异常   1.多异常类型 代码要引发任何异常,只需为要引发的异常实例实例附加关键字throw作为前缀.具体选择 ...

  5. Linux 网络编程基础(1)--网络相关的数据结构及转化函数

    在Linux下进行网络编程,使用的语言一般为C.就个人感受而言,在Linux下进行网络程序的编写,重要的不是代码能力要多强,而是对Linux的网络编程思想的理解和对Linux网络数据结构的掌握.如果想 ...

  6. Time模块和datetime模块

    Time模块和datetime模块 一. 调用 import time       #调用time模块 二.使用方法 1.time.time 拿到时间戳.以Linux诞生年份1970年开始计算到程序执 ...

  7. spring整合redis使用RedisTemplate的坑Could not get a resource from the pool

    一.背景 项目中使用spring框架整合redis,使用框架封装的RedisTemplate来实现数据的增删改查,项目上线后,我发现运行一段时间后,会出现异常Could not get a resou ...

  8. 章节七、4-Sets

    一.set中不允许存在相同的元素 package ZangJie7; import java.util.ArrayList; import java.util.HashSet; import java ...

  9. JDBC 事务和 JTA 事务

    Java事务的类型有三种:JDBC事务.JTA(Java Transaction API)事务.容器事务. 常见的容器事务如Spring事务,容器事务主要是J2EE应用服务器提供的,容器事务大多是基于 ...

  10. 在 Linux 下使用mdadm创建 RAID 5

    在 RAID 5 中,数据条带化后存储在分布式奇偶校验的多个磁盘上.分布式奇偶校验的条带化意味着它将奇偶校验信息和条带化数据分布在多个磁盘上,这样会有很好的数据冗余. 在 Linux 中配置 RAID ...