Android——UIL实现图片缓存基本配置及使用


 

一, 为什么要使用图片缓存


      在说为什么要使用图片缓存之前,先说说为什么要使用缓存?可能之前我们使用过cache, L1 cache,cookie,Session,Memcached,redis,encache,sharedPreference...这么多缓存,无非是为了避免多次读取磁盘或者网络,提高速度;(还要理解缓存的使用条件)。

       接下来说说为啥要使用“图片缓存”:

      当客户端在请求网络数据的时候,是需要消耗流量的,特别是对于移动端用户来说,对于流量的控制要求很高。所以在做网络请求的时候,如果对数据更新要求不是特别高,往往都会用到缓存机制,一方面能减少对服务端的请求,控制流量;另一方面,当客户端在没有网络的情况下也能 看到上一次请求的数据,这样使用户体验更佳。


二,UIL(Android-Universal-Image-Loader)


   图片缓存,目前使用最广泛的图片缓存,支持主流图片缓存的绝大多数特性。
   项目地址: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


三,基本使用方法


1,引入jar包

 


2,全局Application配置


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*/

   
}
}

 

 

4,AndroidManifest.xml中配置


权限设置:


<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

 

Applicatian的name设置:



5,方法一:使用DisplayImageOptions+loadImage配置加载图片


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上面
    }
});
*/

 

7,方法二:使用使用DisplayImageOptions+displayImage加载图片

 

/*方法二:使用使用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);


四,Run一下看看吧


      会发现加载过一遍之后,没有网的时候,会使用内存中的缓存图片或者disk中的缓存图片来显示,就像大家常用的QQ空间,没网的时候,也会看到空间中我们以前浏览过的内容。









你可能感兴趣的:(android,图片,缓存,开源框架,UIL)