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空间,没网的时候,也会看到空间中我们以前浏览过的内容。

时间: 2024-08-31 12:53:34

Android——UIL实现图片缓存基本配置及使用的相关文章

Android公共库——图片缓存 网络缓存 下拉及底部更多ListView 公共类

PS:这是准备分享的三个系列之一,暂时告一段落,后续准备开始Android性能优化系列以及Java多线程系列. 一. 缓存类 1. 图片缓存使用见:图片缓存的使用适用:获取图片较多的应用,如新浪微博.twitter.微信头像.美丽说.蘑菇街.花瓣.淘宝等等.主要特性:(1). 使用简单 (2). 轻松获取及预取新图片 (3). 包含二级缓存 (4). 可选择多种缓存算法(FIFO.LIFO.LRU.MRU.LFU.MFU等13种)或自定义缓存算法 (5). 可方便的保存及初始化恢复数据 (6).

Android图片缓存之初识Glide(三)_Android

前言: 前面总结学习了图片的使用以及Lru算法,今天来学习一下比较优秀的图片缓存开源框架.技术本身就要不断的更迭,从最初的自己使用SoftReference实现自己的图片缓存,到后来做电商项目自己的实现方案不能满足项目的需求改用Afinal,由于Afinal不再维护而选择了师出同门的Xutils,中间也接触过别的开源框架比如Picasso,对Picasso的第一次印象就不太好,初次接触是拿到了公司刚从外包公司接手过来的图片社交类app,对内存占用太大,直接感受就是导致ListView滑动有那么一

volley-Android Volley获取图片缓存问题

问题描述 Android Volley获取图片缓存问题 写了一个加载网络图片到listview的小demo.图片是用volley的networkImageView加载的,然后我发现在断网的情况下缓存中的图片会加载到listview上面去,但是在联网的情况下,程序没有先去获取缓存中的数据,而还是去获取了网络数据...请教下为啥. NetworkImageView image = (NetworkImageView) view.findViewById(R.id.network_image); im

Android中Glide加载库的图片缓存配置究极指南_Android

零.选择Glide为什么图片加载我首先推荐Glide? 图片加载框架用了不少,从afinal框架的afinalBitmap,Xutils的BitmapUtils,老牌框架universalImageLoader,著名开源组织square的picasso,google推荐的glide到FaceBook推出的fresco.这些我前前后后都体验过,那么面对这么多的框架,该如何选择呢?下面简单分析下我的看法. afinal和Xuils在github上作者已经停止维护了,开源社区最新的框架要属KJFram

Android中Glide加载库的图片缓存配置究极指南

零.选择Glide 为什么图片加载我首先推荐Glide? 图片加载框架用了不少,从afinal框架的afinalBitmap,Xutils的BitmapUtils,老牌框架universalImageLoader,著名开源组织square的picasso,google推荐的glide到FaceBook推出的fresco.这些我前前后后都体验过,那么面对这么多的框架,该如何选择呢?下面简单分析下我的看法. afinal和Xuils在github上作者已经停止维护了,开源社区最新的框架要属KJFra

Android开发笔记之图片缓存、手势及OOM分析_Android

把图片缓存.手势及OOM三个主题放在一起,是因为在Android应用开发过程中,这三个问题经常是联系在一起的.首先,预览大图需要支持手势缩放,旋转,平移等操作:其次,图片在本地需要进行缓存,避免频繁访问网络:最后,图片(Bitmap)是Android中占用内存的大户,涉及高清大图等处理时,内存占用非常大,稍不谨慎,系统就会报OOM错误. 庆幸的是,这三个主题在Android开发中属于比较普遍的问题,有很多针对于此的通用的开源解决方案.因此,本文主要说明笔者在开发过程中用到的一些第三方开源库.主要

Android开发笔记之图片缓存、手势及OOM分析

把图片缓存.手势及OOM三个主题放在一起,是因为在Android应用开发过程中,这三个问题经常是联系在一起的.首先,预览大图需要支持手势缩放,旋转,平移等操作:其次,图片在本地需要进行缓存,避免频繁访问网络:最后,图片(Bitmap)是Android中占用内存的大户,涉及高清大图等处理时,内存占用非常大,稍不谨慎,系统就会报OOM错误. 庆幸的是,这三个主题在Android开发中属于比较普遍的问题,有很多针对于此的通用的开源解决方案.因此,本文主要说明笔者在开发过程中用到的一些第三方开源库.主要

Android 三大图片缓存原理、特性对比

这是我在 MDCC 上分享的内容(略微改动),也是源码解析第一期发布时介绍的源码解析后续会慢慢做的事.   从总体设计和原理上对几个图片缓存进行对比,没用到他们的朋友也可以了解他们在某些特性上的实现.   上篇关于选择开源项目的好处及如何选择开源项目可见:开源项目使用及选型.   一. 四大图片缓存基本信息 Universal ImageLoader 是很早开源的图片缓存,在早期被很多应用使用.   Picasso 是 Square 开源的项目,且他的主导者是 JakeWharton,所以广为人

Android图片缓存之Bitmap详解(一)_Android

前言: 最近准备研究一下图片缓存框架,基于这个想法觉得还是先了解有关图片缓存的基础知识,今天重点学习一下Bitmap.BitmapFactory这两个类.  Bitmap:Bitmap是Android系统中的图像处理的最重要类之一.用它可以获取图像文件信息,进行图像剪切.旋转.缩放等操作,并可以指定格式保存图像文件. 重要函数  •public void recycle() // 回收位图占用的内存空间,把位图标记为Dead  •public final boolean isRecycled()