在说为什么要使用图片缓存之前,先说说为什么要使用缓存?可能之前我们使用过cache, L1 cache,cookie,Session,Memcached,redis,encache,sharedPreference...这么多缓存,无非是为了避免多次读取磁盘或者网络,提高速度;(还要理解缓存的使用条件)。
接下来说说为啥要使用“图片缓存”:
当客户端在请求网络数据的时候,是需要消耗流量的,特别是对于移动端用户来说,对于流量的控制要求很高。所以在做网络请求的时候,如果对数据更新要求不是特别高,往往都会用到缓存机制,一方面能减少对服务端的请求,控制流量;另一方面,当客户端在没有网络的情况下也能 看到上一次请求的数据,这样使用户体验更佳。
图片缓存,目前使用最广泛的图片缓存,支持主流图片缓存的绝大多数特性。
项目地址:https://github.com/nostra13/Android-Universal-Image-Loader
原理剖析文档:Android-Universal-Image-Loader
Demo 地址:https://github.com/Trinea/TrineaDownload/blob/master/universal-imageloader-demo.apk?raw=true
文档介绍:http://www.intexsoft.com/blog/item/74-universal-image-loader-part-3.html
3, **
* Created by LiuHuiChao on 2015/11/5.
*/
public class myApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//设置获取缓存的目录:测试使用
// File cacheDir=StorageUtils.getOwnCacheDirectory(this,"JRKJ/cache");
/*
* configuration表示ImageLoader的全局配置信息,创建ImageLoader时使用
* 可包括图片最大尺寸,线程池,缓存,下载器,解码器等等。
* 这里可以根据需要自行配置,修改慎重!
* */
ImageLoaderConfigurationconfiguration =new ImageLoaderConfiguration.Builder(this)
.memoryCacheExtraOptions(480, 800)/*解析图片时候使用的最大尺寸,默认为屏幕设备宽高*/
.diskCacheExtraOptions(480, 800, null)/*从网络下载图片后保存到磁盘时使用的图片尺寸及压缩方法,如果不设置则保存原始图片*/
.threadPoolSize(3)/*线程池的大小,默认值为3,注意不要设置的过大,过大之后会有OOM问题*/
.threadPriority(Thread.NORM_PRIORITY - 1)/*设置线程的优先级别:5-1*/
/*
* tasksProcessingOrder:设置图片加载和显示队列处理的类型 默认为QueueProcessingType.
FIFO注:如果设置了taskExecutor或者taskExecutorForCachedImages 此设置无效
*/
.tasksProcessingOrder(QueueProcessingType.FIFO)
.memoryCache(new LruMemoryCache(2 * 1024 * 1024))/*设置内存缓存 默认为一个当前应用可用内存的1/8大小的LruMemoryCache*/
.memoryCacheSize(2 * 1024 * 1014)/*设置内存缓存的最大大小 默认为一个当前应用可用内存的1/8 */
.memoryCacheSizePercentage(13)/*设置内存缓存最大大小占当前应用可用内存的百分比 默认为一个当前应用可用内存的1/8*/
.diskCache(new UnlimitedDiskCache(StorageUtils.getCacheDirectory(getApplicationContext())))/*默认为StorageUtils.getCacheDirectory(getApplicationContext()),即/mnt/sdcard/android/data/包名/cache/*/
.diskCacheSize(50 * 1024 * 1024)/*设置硬盘缓存的最大大小*/
.diskCacheFileCount(100)/*设置硬盘缓存的文件的最多个数*/
.diskCacheFileNameGenerator(new HashCodeFileNameGenerator())/*设置硬盘缓存文件名生成规范*/
.imageDownloader(new BaseImageDownloader(this))/*设置图片下载器*/
.imageDecoder(DefaultConfigurationFactory.createImageDecoder(false))/*设置图片解码器*/
.defaultDisplayImageOptions(DisplayImageOptions.createSimple())/*设置默认的图片显示选项*/
.denyCacheImageMultipleSizesInMemory()/*不缓存图片的多种尺寸在内存中*/
.writeDebugLogs()/*打印调试Log,注意上线之前要去掉这句话*/
.imageDownloader(/*图片下载器的设置*/
new BaseImageDownloader(this, 5 * 1000, 30 * 100)/*(connectTimeout,readTimeout)超时时间*/
)
.build();
ImageLoader.getInstance().init(configuration);/*使用基本配置信息初始化ImageLoader*/
}
}
权限设置:
<uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Applicatian的name设置:
6, imgDemoPic=(ImageView)findViewById(R.id.imgDemoPic);//imageView用来显示图片 /*图片地址*/ String imgUrl="http://f.hiphotos.baidu.com/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=597e2ad1a7c27d1eb12b33967abcc60b/21a4462309f790521563df4b0ff3d7ca7bcbd543.jpg"; ImageSize mImageSize=new ImageSize(100,100); /*方法一:使用DisplayImageOptions+loadImage配置加载图片*/ //显示图片的配置 /* DisplayImageOptions options=new DisplayImageOptions.Builder() .cacheInMemory(true) .cacheOnDisk(true) .bitmapConfig(Bitmap.Config.RGB_565) .build(); ImageLoader.getInstance().loadImage(imgUrl,mImageSize,new SimpleImageLoadingListener(){ @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { super.onLoadingComplete(imageUri, view, loadedImage); imgDemoPic.setImageBitmap(loadedImage);//显示在imageView上面 } }); */
/*方法二:使用使用DisplayImageOptions+displayImage加载图片*/ DisplayImageOptions options=new DisplayImageOptions.Builder() .showImageOnLoading(R.drawable.image1)/*加载图片的时候显示正在加载的图*/ .showImageOnFail(R.drawable.image1)/*加载图片失败后显示这个张图*/ .cacheInMemory(true)/*缓存至内存*/ .cacheOnDisk(true)/*缓存值SDcard*/ .bitmapConfig(Bitmap.Config.RGB_565) .build(); ImageLoader.getInstance().displayImage(imgUrl,imgDemoPic,options);
会发现加载过一遍之后,没有网的时候,会使用内存中的缓存图片或者disk中的缓存图片来显示,就像大家常用的QQ空间,没网的时候,也会看到空间中我们以前浏览过的内容。