(universal Image Loader)UIL 使用 (2)
来源:互联网 发布:双十一淘宝秒杀怎么弄 编辑:程序博客网 时间:2024/06/03 12:26
系列(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 trueboolean pauseOnFling = true; // or falsePauseOnScrollListener 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)
- (universal Image Loader)UIL 使用 (1)
- Android-Universal-Image-Loader(UIL)使用分析
- 开源项目UIL(UNIVERSAL-IMAGE-LOADER)
- (UIL)使用3之Android Universal Image Loader 源码分析
- Universal-Image-Loader(UIL)图片加载框架使用简单介绍
- 【UIL框架】Universal-Image-Loader完全解析(一)之介绍与使用详解
- Universal-Image-Loader 使用
- 异步图片加载Fresco v/s Universal Image Loader (UIL)
- Android-Universal-Image-Loader(UIL)源码解析(一)
- Android-Universal-Image-Loader(UIL)源码解析(二)
- (转) Universal-Image-Loader使用大全(史上最屌)
- Universal-Image-Loader学习系列(二),ImageLoaderConfiguration的使用
- Universal-Image-Loader源码阅读(2)-utils/L
- Universal-Image-Loader(android图片缓存)
- Universal-Image-Loader(android图片缓存)
- Universal-Image-Loader(android图片缓存)
- Universal-Image-Loader(android图片缓存)
- poj 1840 Eqs
- Android OpenGL ES学习笔记之材质概念和添加光照
- 懒虫的思维
- 数据结构上机测试1:顺序表的应用
- 独立同分布 正态分布
- (universal Image Loader)UIL 使用 (2)
- php 操作mongodb
- CCS5.4+Proteus8的F28027实践课八、内置温度传感器
- (HDU 5793)2016 Multi-University Training Contest 6 A Boring Question (规律)
- 理解图像空间域操作
- ubuntu shadowsocks-qt5 pac 全局代理
- Masonry基础语法
- FZU 1056 扫雷游戏
- 深度学习Caffe平台开发环境准备——1.python 引用Matplotlib 显示不出图的解决方案