系列(universal Image Loader)UIL 使用 (1)   UIL 使用 3 简单介绍了UIL的最基本的使用方法,这次继续老学习UIL的使用

这次只是分析学习一个方法

<span style="font-size:12px;">displayImage(String uri, ImageAware imageAware, DisplayImageOptions options,ImageSize targetSize, ImageLoadingListener listener, ImageLoadingProgressListener progressListener)</span>

简单介绍一下某些参数

imageAware 需要显示图片的对象的接口,可包装 View 表示某个需要显示图片的 View (例如可以是ImageView)

<span style="font-size:12px;">DisplayImageOptions options = new DisplayImageOptions.Builder().showImageOnLoading(R.drawable.ic_stub) // 当图片正在加载的时候显示的图片.showImageForEmptyUri(R.drawable.ic_empty) // 当图片URI为空的时候显示的图片.showImageOnFail(R.drawable.ic_error) //当图片加载失败的时候显示的图片.resetViewBeforeLoading(false)  // 加载前ImageAware设为null , 默认false.delayBeforeLoading(0)//延迟加载图片的时间,默认为0.cacheInMemory(false) // default 默认不使用memorycache .cacheOnDisk(false) // default默认不使用.preProcessor(...)//图片进入内存是否需要先处理(压缩什么的)BitmapProcessor是一个接口.postProcessor(...)//显示图片之前对图进行处理,处理之后的bitmap保存到内存缓存中.extraForDownloader(...)设置额外的内容给ImageDownloader.considerExifParams(false)  //是否考虑JPEG图像EXIF参数(旋转,翻转).imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // //设置 图片的缩放方式.bitmapConfig(Bitmap.Config.ARGB_8888) // 图片的解码类型.decodingOptions(...)设置图片的解码配置  .displayer(new SimpleBitmapDisplayer()) // 设置图片的显示方式,.handler(new Handler()) // default.build();</span>

ImageSize 图片的大小,

<span style="font-size:12px;">public interface ImageLoadingListener {//图片开始加载回调的函数void onLoadingStarted(String imageUri, View view);//加载失败回调的函数void onLoadingFailed(String imageUri, View view, FailReason failReason);//加载完成的函数void onLoadingComplete(String imageUri, View view, Bitmap loadedImage);//加载取消后回调的函数void onLoadingCancelled(String imageUri, View view);
}</span>

ImageLoadingProgressListener

<span style="font-size:12px;">public interface ImageLoadingProgressListener {/*** Is called when image loading progress changed.* 会在获取图片存储到文件系统时被回调。(开了disk缓存)* @param imageUri Image URI* @param view     View for image. Can be <b>null</b>.* @param current  Downloaded size in bytes * @param total    Total size in bytes图片的总大小*/void onProgressUpdate(String imageUri, View view, int current, int total);
}
</span>
</pre><span style="font-size:12px;"></span><pre name="code" class="java"><span style="font-size:12px;">/*** Adds display image task to execution pool. Image will be set to ImageAware when it's turn.<br />* <b>NOTE:</b> {@link #init(ImageLoaderConfiguration)} method must be called before this method call** @param uri              * @param imageAware 需要显示图片的对象的接口,可包装 View 表示某个需要显示图片的 View       * @param options          * @param targetSize       * @param listener         * @param progressListener * @throws IllegalStateException    * @throws IllegalArgumentException */public void displayImage(String uri, ImageAware imageAware, DisplayImageOptions options,ImageSize targetSize, ImageLoadingListener listener, ImageLoadingProgressListener progressListener) {checkConfiguration();//检查configuration是否为空,即是否初始化了ImageLoader,函数init()//显示图片的View为空,假如只是想下载图片,可以使用loadImageif (imageAware == null) {throw new IllegalArgumentException(ERROR_WRONG_ARGUMENTS);}if (listener == null) {listener = defaultListener;//defaultListener = new SimpleImageLoadingListener();}if (options == null) {options = configuration.defaultDisplayImageOptions;}//判断URI是否为空if (TextUtils.isEmpty(uri)) {//任务分发器取消这个任务engine.cancelDisplayTaskFor(imageAware);//回调start 和 complete 方法listener.onLoadingStarted(uri, imageAware.getWrappedView());if (options.shouldShowImageForEmptyUri()) {imageAware.setImageDrawable(options.getImageForEmptyUri(configuration.resources));} else {imageAware.setImageDrawable(null);}listener.onLoadingComplete(uri, imageAware.getWrappedView(), null);return;}if (targetSize == null) {targetSize = ImageSizeUtils.defineTargetSizeForView(imageAware, configuration.getMaxImageSize());}//生成缓存的文件名,用generator 根据URI和图片的大小String memoryCacheKey = MemoryCacheUtils.generateKey(uri, targetSize);//分配器准备分发展示图片的任务engine.prepareDisplayTaskFor(imageAware, memoryCacheKey);listener.onLoadingStarted(uri, imageAware.getWrappedView());//尝试从memorycache中看看需要下载的图片是否存在Bitmap bmp = configuration.memoryCache.get(memoryCacheKey);//在memoryCache 中if (bmp != null && !bmp.isRecycled()) {L.d(LOG_LOAD_IMAGE_FROM_MEMORY_CACHE, memoryCacheKey);//展示前是否需要处理一些图片if (options.shouldPostProcess()) {ImageLoadingInfo imageLoadingInfo = new ImageLoadingInfo(uri, imageAware, targetSize, memoryCacheKey,options, listener, progressListener, engine.getLockForUri(uri));//处理和现实图片的任务ProcessAndDisplayImageTask displayTask = new ProcessAndDisplayImageTask(engine, bmp, imageLoadingInfo,defineHandler(options));//是否是同步if (options.isSyncLoading()) {displayTask.run();} else {engine.submit(displayTask);//任务分发器分发任务,线程池有空的线程就会去执行,这里主要的就是现实图片}} else {options.getDisplayer().display(bmp, imageAware, LoadedFrom.MEMORY_CACHE);listener.onLoadingComplete(uri, imageAware.getWrappedView(), bmp);}} else {if (options.shouldShowImageOnLoading()) {//设置加载中的图片imageAware.setImageDrawable(options.getImageOnLoading(configuration.resources));} else if (options.isResetViewBeforeLoading()) {imageAware.setImageDrawable(null);}ImageLoadingInfo imageLoadingInfo = new ImageLoadingInfo(uri, imageAware, targetSize, memoryCacheKey,options, listener, progressListener, engine.getLockForUri(uri));LoadAndDisplayImageTask displayTask = new LoadAndDisplayImageTask(engine, imageLoadingInfo,defineHandler(options));if (options.isSyncLoading()) {displayTask.run();} else {engine.submit(displayTask);//这里是下载和现实图片}}}</span>

整体来说还是非常简单的使用这个框架

注意的地方:

1.默认情况下,memoryCache 和diskCache 是没有开的,需要在DisplayImageOptions 中设置才能使用缓存

<span style="font-size:12px;">DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()....cacheInMemory(true).cacheOnDisk(true)....build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())....defaultDisplayImageOptions(defaultOptions)....build();
ImageLoader.getInstance().init(config);</span>

2.如果你开启了diskCache 的话 ,UIL就会先尝试在SD卡上建立缓存,(/sdcard/Android/data/[package_name]/cache) ,

假如没有sd卡的话,就会在系统自带的文件系统中建立,所以,你要申明相应的写sd卡权限

<span style="font-size:12px;"><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" /></span>

3.对于一个确定的ImageView ,UIL是如何确定bitmap的大小的?UIL会寻求一下一些参数:

①得到imageView 的测量的高和宽

②根据layout_width 和 layout_heigjt

③根据maxWidth 和 maxHeight

④从configuration 中获得最大的width 和 height 即获取maxImageWidthForMemoryCache  和maxImageHeightForMemoryCache

⑤根据你手机的屏幕宽高

所以当你知道你需要下载图片图片的大小的时候,可以在imageView中设置layout_widht/height 或者maxwidth/height 的值,有利于UIL计算bitmap的大小和保存

4.假如你的app使用UIL出现OOM

①不要使用memoryCahce ,假如不再使用memoryCache 还是出现OOM ,那么可呢个就是内存泄漏了,可以使用memoryAnalyzer检查

②减少线程池的线程的数目 1 --- 5 推荐

③图片的解码方式改为.bitmapConfig(Bitmap.Config.RGB_565)  默认是8888 ,565 比8888 少两倍

④使用.imageScaleType(ImageScaleType.EXACTLY),显示的时候正常显示

⑤在configuration中.diskCacheExtraOptions(480, 320, null)

5如果你在configuration 中 自定义MemoryCache对象的话(ImageLoaderConfiguration.memoryCache(...)),你可以选择下面的一些类

只保存强引用:

LruMemoryCache默认是这个 ,这个是当达到memoryCache Size的时候,选择删去那些最近最少使用的Bitmap

保存弱引用和强引用

UsingFreqLimitedMemoryCache  最不常用的bitmap被删去当memoryCache 满的时候

LRULimitedMemoryCache 最近最少使用的被删去

FIFOLimitedMemoryCache 先进先出,先进到memoryCache 的 bitmap 被删去

LargestLimitedMemoryCache  占用内存大的图片先被删去

LimitedAgeMemoryCache (Decorator. Cached object is deleted when its age exceeds defined value)生命周期到了就会删去,定期删去

值保存弱引用

WeakMemoryCache  无限制

6.如果你使用configuration.diskCache可以选择下面的类:

UnlimitedDiscCache  最快的缓存 ,但是没有限制大小(默认值)

LruDiskCache  缓存的大小和缓存文件的数目会有限制,达到限制值会删去最近最少使用的

LimitedAgeDiscCache  生命周期 ,达到生命周期后将会被删去, LimitedAgeMemoryCache(MemoryCache cache, long maxAge)单位秒

NOTE:UnlimitedDiscCache  比其他两种要快

7.如自定义DisplayImageOptions.displayer(...) 可以选择下面的类

FadeInBitmapDisplayer
淡入动画显示图片
RoundedBitmapDisplayer
圆角显示图片
RoundedVignetteBitmapDisplayer
圆角显示图片,颜色会有个渐变的效果
SimpleBitmapDisplayer
简单实现

8.为了避免listView 之类的大量tupperware滚动滞后问题,你可以使用PauseOnScrollListener

boolean pauseOnScroll = false; // or true
boolean pauseOnFling = true; // or false
PauseOnScrollListener listener = new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling);
listView.setOnScrollListener(listener);

9.如果你看到的这样的网址,http://anysite.com/images/image.png_230x460   这个是UTL +targetSize 真正的URL 是http://anysite.com/images/image.png

10.UIL 总是保存着图片的纵横比

11.
ImageScaleType图片的缩放类型(DisplayImageOptions中设置)

EXACTLY:图像将完全按比例缩小的目标大小
EXACTLY_STRETCHED:图片会缩放到目标大小
IN_SAMPLE_INT:图像将被二次采样的整数倍
IN_SAMPLE_POWER_OF_2:图片将降低2倍,直到下一减少步骤,使图像小于目标大小
NONE:图片不会调整

12.多种URI格式

"http://site.com/image.png" // Web"file:///mnt/sdcard/image.png" // SD card"file:///mnt/sdcard/video.mp4" // SD card (video thumbnail)"content://media/external/images/media/13" // content provider"content://media/external/video/media/13" // content provider (video thumbnail)"assets://image.png" // assets"drawable://" + R.drawable.img // drawables (non-9patch images)

未完代写....

(universal Image Loader)UIL 使用 (2)相关推荐

  1. (universal Image Loader)UIL 使用 (1)

    UIL Github 网址 系类文章:(universal Image Loader)UIL使用(2),UIL使用3 universal image loader 的功能就是加载图片 在as 中 ap ...

  2. android universal image loader 缓冲原理详解

    1. 功能介绍 1.1 Android Universal Image Loader Android Universal Image Loader 是一个强大的.可高度定制的图片缓存,本文简称为UIL ...

  3. 【Android应用开发】 Universal Image Loader ( 使用简介 | 示例代码解析 )

    作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/50824912 相关地址介绍 : -- Universal I ...

  4. universal image loader在listview/gridview中滚动时重复加载图片的问题及解决方法

    universal image loader在listview/gridview中滚动时重复加载图片的问题及解决方法 参考文章: (1)universal image loader在listview/ ...

  5. 【译】UNIVERSAL IMAGE LOADER. PART 3---ImageLoader详解

    在之前的文章,我们重点讲了Android-Universal-Image-Loader的三个主要组件,现在我们终于可以开始使用它了. Android-Universal-Image-Loader有四个 ...

  6. 全网最全Android开发工具,Android开发框架大全

    涵盖Android方方面面的技术, 目前保持更新. 时刻与Android开发流行前沿同步. 目录 一.工具 Android开发工具 在线工具宝典大全 二.框架 *缓存框架* DiskLruCache ...

  7. 【Android 进阶】Android优秀框架

    根据上图我们依次说明: 1,DiskLruCache 硬盘缓存最佳方案(Google提供的一套硬盘缓存的解决方案:DiskLruCache(非Google官方编写,但获得官方认证)) DiskLruC ...

  8. 图片加载框架之UIL

    1. 功能介绍 1.1 Android Universal Image Loader Android Universal Image Loader 是一个强大的.可高度定制的图片缓存,本文简称为UIL ...

  9. 从UIL库谈Android图片加载中需要注意的事情

    Android Universal Image Loader 算是Android中最流行的图片加载库了,作者Sergey的确牛逼,能将整个Android图片加载的点点滴滴考虑的如此全面.网上研究这个开 ...

最新文章

  1. QT代码格式化快捷键
  2. bert中文预训练模型_HFL中文预训练系列模型已接入Transformers平台
  3. Django在根据models生成数据库表时报 missing 1 required positional argument on_delete(亲测)
  4. iphone xh5打开ppt预览_教你如何用iPhone拍全景照片
  5. redis scan 效率太慢_Redis 基础、高级特性与性能调优(下)
  6. mac与windows服务器 访问和共享
  7. multism中ui和uo应该怎么表示_吐血整理!这篇带你彻底理解主存中存储单元地址的分配...
  8. LaTeX调整目录的行距
  9. ARM产品二十年路线图
  10. for /r命令实现全盘搜索指定文件
  11. Django链接Mysql 8.0 出现错误(1045:Access denied for user ‘root‘@‘localhost‘ (using password: NO) 的一种解决方法
  12. ie登录显示登录到ftp服务器,用IE登录FTP服务器怎么消除记住的密码
  13. php数据库模式,具有singleton模式的PHP数据库类[closed]
  14. 良田摄像头 linux,良田万能摄像头高拍仪驱动下载|良田万能摄像头驱动 官方版 - 软件下载 - 绿茶软件园|33LC.com...
  15. 了解 HTTP 看这一篇就够
  16. 计算机辅助故障树分析法,故障树分析法.doc
  17. Flutter笔记(9)flutter中baseline基准线布局
  18. Android客户端和Java服务器端集成支付宝
  19. 【原】移动web资源整理
  20. 关于数学建模、机器学习与深度学习的思考

热门文章

  1. 2017中国国际教育装备博览会会刊(参展商名录)
  2. 移动办公邮箱app,怎么设置邮件归档?
  3. 中国新能源技术装备市场产能产量规模与供需形势分析报告2022年
  4. 不卸载升级cmake
  5. 什么是融资融券,开通融资融券需要什么条件?哪家券商两融利率可以低至5%呢?
  6. 宽屏欧式家具电子商务网站模板
  7. 程序员的乐趣,那些可爱的 Linux 命令
  8. 360 压缩终于庐山真面目了
  9. 安装QQ2009时提示无法访问Windows安装服务
  10. d3.js v3版本实现-树状图