AndroidUniversalImageLoader使用详解

来源:互联网 发布:指向数组元素的指针 编辑:程序博客网 时间:2024/06/06 04:28

【本文转自:快码-官方博客】

个性的ImageLoader配置

在哪儿配置以及如何配置

一般会在自己的Application子类的onCreate()方法中对ImageLoader进行配置

ImageLoaderConfiguration各属性解释

偷懒点可以直接使用缺省的配置ImageLoaderConfiguration:

ImageLoaderConfiguration configuration = ImageLoaderConfiguration.createDefault(this);

也可以自定义ImageLoaderConfiguration(ImageLoaderConfiguration类Field详解):

  • int maxImageWidthForMemoryCache/maxImageHeightForMemoryCache:内存缓存图片的最大宽高 [对应Builder中设置方法:memoryCacheExtraOptions(…)];
  • int maxImageWidthForDiskCache/maxImageHeightForDiskCache:磁盘缓存图片的最大宽高[对应Builder中设置方法:discCacheExtraOptions(…)/diskCacheExtraOptions(…)];
  • BitmapProcessor processorForDiskCache:图片处理器,负责从磁盘缓存读取或写入前对图片进行处理 [对应Builder中设置方法:discCacheExtraOptions(…)/diskCacheExtraOptions(…)];
  • Executor taskExecutor:缓存线程池[对应Builder中设置方法:taskExecutor(…)];
  • Executor taskExecutorForCachedImages:下载缓存图片的线程池 [对应Builder中设置方法:taskExecutorForCachedImages(…)];
  • Boolean customExecutor:是否自定义线程池 [默认值:false];
  • Boolean customExecutorForCachedImages:是否自定义下载缓存图片的线程池 [默认值:false];
  • Int threadPoolSize:线程池数[对应Builder中设置方法:threadPoolSize(…)];
  • Int threadPriority:线程优先级 [对应Builder中设置方法:threadPriority(…)];
  • QueueProcessingType tasksProcessingType:片下载和显示的工作队列排序 [对应Builder中设置方法:tasksProcessingOrder(…)];
  • MemoryCache memoryCache:指定内存缓存的实现[对应Builder中设置方法:memoryCache(…)];
  • DiskCache diskCache:指定磁盘缓存的实现 [对应Builder中设置方法:discCache(…)/diskCache(…)];
  • ImageDownloader downloader:图片下载器,负责从图片的各个来源获取输入流 [对应Builder中设置方法:imageDownloader(…)];
  • ImageDecoder decoder:图片解码器,负责将图片输入流InputStream转换为Bitmap对象 [对应Builder中设置方法:imageDecoder(…)];
  • DisplayImageOptions defaultDisplayImageOptions:缺省的图片显示的配置项 [对应Builder中设置方法:defaultDisplayImageOptions(…)];
  • ImageDownloader networkDeniedDownloader:不允许访问网络的图片下载器 [默认值,无法设置:networkDeniedDownloader = new NetworkDeniedImageDownloader(downloader)];
  • ImageDownloader slowNetworkDownloader:慢网络情况下的图片下载器 [默认值,无法设置:slowNetworkDownloader = new SlowNetworkImageDownloader(downloader)];

DisplayImageOptions各属性解释

创建默认的DisplayImageOptions:

DisplayImageOptions option_0 = DisplayImageOptions.createSimple();

也可以自定义DisplayImageOptions(DisplayImageOptions类Field详解):

  • int imageResOnLoading/Drawable imageOnLoading:图片下载期间显示的图片[Builder中设置的方法:showStubImage(…)/showImageOnLoading(…)];
  • int imageResForEmptyUri/Drawable imageForEmptyUri:空uri时的占位图片[Builder中设置的方法:showImageForEmptyUri(…)];
  • int imageResOnFail/Drawable imageOnFail:图片下载失败时展示图片[Builder中设置的方法:showImageOnFail(…)];
  • boolean resetViewBeforeLoading:在加载前是否重置[Builder中设置的方法:resetViewBeforeLoading()/resetViewBeforeLoading(…)];
  • boolean cacheInMemory:是否启用内存缓存[Builder中设置的方法:cacheInMemory()/cacheInMemory(…)];
  • boolean cacheOnDisk:是否启用磁盘缓存[Builder中设置的方法:cacheOnDisc()/cacheOnDisc(…)/cacheOnDisk(…)];
  • ImageScaleType imageScaleType:图片的缩放类型[Builder中设置的方法:imageScaleType(ImageScaleType imageScaleTy];
  • Options decodingOptions:为BitmapFactory.Options,用于BitmapFactory.decodeStream(imageStream, null, decodingOptions)得到图片尺寸等信息[Builder中设置的方法:bitmapConfig(Bitmap.Config bitmapConfig)/decodingOptions(Options decodingOptions)];
  • int delayBeforeLoading:设置在开始加载前的延迟时间,单位为毫秒[Builder中设置的方法:delayBeforeLoading(int delayInMillis)];
  • boolean considerExifParams:是否考虑图片的 EXIF 信息(括机身、镜头型号、拍摄时间、相机快门次数)[Builder中设置的方法:considerExifParams(…)];
  • Object extraForDownloader:下载器需要的辅助信息[Builder中设置的方法:extraForDownloader(Object extra)];
  • BitmapProcessor preProcessor:缓存在内存之前的处理程序[Builder中设置的方法:preProcessor(…)];
  • BitmapProcessor postProcessor:缓存在内存之后的处理程序[Builder中设置的方法:postProcessor(…)];
  • BitmapDisplayer displayer:图片的显示方式[Builder中设置的方法:displayer(…)];
  • Handler handler:handler:对象,消息处理[Builder中设置的方法:handler(…)];
  • boolean isSyncLoading:是否同步加载[Builder中设置的方法:syncLoading(…)];

自定义配置总结:

  • Imageloader提供的缺省的ImageLoaderConfiguration和缺省的DisplayImageOptions已经基本可以满足我们正常的需求,如果没有特殊的需要可以不用再修改;
  • ImageLoaderConfiguration的Builder中的diskCache()方法, diskCacheSize() 方法以及diskCacheFileCount()方法彼此功能重叠的,如果设置了其中一个,就不要再设置其他的了;
  • ImageLoaderConfiguration的Builder中的diskCache()方法 和 diskCacheFileNameGenerator()方法彼此功能重叠的,如果设置了其中一个,就不要再设置其他的了;
  • ImageLoaderConfiguration的Builder中的memoryCache() 方法和memoryCacheSize()方法 彼此功能重叠的,如果设置了其中一个,就不要再设置其他的了。

补充理解:三大关键对象关系

  • ImageLoader:
    具体下载图片,缓存图片,显示图片的具体执行类,它有两个具体的方法displayImage(…)、loadImage(…),但是其实最终他们的实现都是displayImage(…);
  • ImageLoaderConfiguration:
    图片缓存的全局配置,主要有线程类、缓存大小、磁盘大小、图片下载与解析、日志方面的配置;
  • DisplayImageOptions:
    指导每一个Imageloader根据网络图片的状态(空白、下载错误、正在下载)显示对应的图片,是否将缓存加载到磁盘上,下载完后对图片进行怎么样的处理;
  • 三者关系的形象比喻:
    这三者就像是公司执行机构、公司规章制度以及客户需求,ImageLoaderConfiguration就像一个公司的规章制度,里面规定了一个公司全局性的性质;ImageLoader就像是一个公司的执行机构,会给客户创造出客户想要的产品;DisplayImageOptions就像是每一个客户的具体需求,公司执行结构会根据这个需求最终决定如何生产那个产品。

各式缓存方式任你选择

DiskCache 磁盘缓存

  • UnlimitedDiscCache不限制缓存大小;
  • UnlimitedDiscCache很简单它只是简单的继承了BaseDiscCache并未对BaseDiscCache做任何扩展;
  • LimitedAgeDiscCache限制缓存时间;
  • LimitedAgeDiscCache该类实现了在缓存中删除被加载超过规定时间的文件:满足以下条件的时候就从缓存中删除文件:系统当前时间-文件的最新修改时间 > maxFileAge;

MemoryCache内存缓存

  • 通过实现接口MemoryCacheAware

不要忘记缓存的清理

一般要在整个应用结束的时候调用下面两个方法,分别情况内存缓存和磁盘缓存,提供用户体验 :
- imageLoader.clearMemoryCache();
- imageLoader.clearDiskCache();


网络图片获取想停就停

主要是用于GirdView,ListView加载图片的情况,因为这两个控件展示图片的时候会出现滑动操作,为了更友好的用户体验,可以设置GirdView,ListView的setOnScrollListener监听事件。

  • listView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));
  • gridView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));

pauseOnScroll—是否在滑动过程中停止加载图片
pauseOnFling—是否在快速猛的滑动中停止加载图片


图像大小由你控制

在ImageLoadingListener接口有以下几个状态监听,用于监听图片下载的不同状态:

  • onLoadingStarted(String imageUri, View view);
  • onLoadingFailed(String imageUri, View view, FailReason failReason);
  • onLoadingComplete(String imageUri, View view, Bitmap loadedImage):
    在图片加载成功之后,可以对获取到的Bitmap进行各种大小设置,图形裁剪操作以及动画效果添加等,
    最后再加图片展示到控件上。
  • onLoadingCancelled(String imageUri, View view)。

注意事项

使用了ImageLoader可以有效的避免程序加载图片出现OOM的情况,但是也不是百分之百的屏蔽这个问题,在有的时候,还是会出现,这个时候,我们 可以从下面几个思路去优化我们的ImageLoader
- 减少配置之中线程池的大小,(.threadPoolSize).推荐1-5;
- 使用.bitmapConfig(Bitmap.config.RGB_565)代替ARGB_8888;
- 使用.imageScaleType(ImageScaleType.IN_SAMPLE_INT)或者 try.imageScaleType(ImageScaleType.EXACTLY);
- 避免使用RoundedBitmapDisplayer.他会创建新的ARGB_8888格式的Bitmap对象;
- 使用.memoryCache(new WeakMemoryCache()),不要使用.cacheInMemory();


下载地址

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

0 0
原创粉丝点击