本文共 4182 字,大约阅读时间需要 13 分钟。
在说为什么要使用图片缓存之前,先说说为什么要使用缓存?可能之前我们使用过cache, L1 cache,cookie,Session,Memcached,redis,encache,sharedPreference...这么多缓存,无非是为了避免多次读取磁盘或者网络,提高速度;(还要理解缓存的使用条件)。
接下来说说为啥要使用“图片缓存”:
当客户端在请求网络数据的时候,是需要消耗流量的,特别是对于移动端用户来说,对于流量的控制要求很高。所以在做网络请求的时候,如果对数据更新要求不是特别高,往往都会用到缓存机制,一方面能减少对服务端的请求,控制流量;另一方面,当客户端在没有网络的情况下也能 看到上一次请求的数据,这样使用户体验更佳。
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*/ }}
权限设置:
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空间,没网的时候,也会看到空间中我们以前浏览过的内容。
转载地址:http://vtqil.baihongyu.com/