博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
具体解说Android的图片下载框架UniversialImageLoader之磁盘缓存(一)
阅读量:7047 次
发布时间:2019-06-28

本文共 3193 字,大约阅读时间需要 10 分钟。

    沉浸在Android的开发世界中有一些年头的猴子们,预计都可以深深的体会到Android中的图片下载、展示、缓存一直是心中抹不去的痛。鄙人亦是如此。Ok,闲话不说。为了督促自己的学习。以下就逐一的挖掘Android中还算是比較牛叉的图片处理框架UniversialImageLoader以飨读者吧!

   凡事假设过于草率必将陷入泥塘不能自拔。还是按部就班的一步一步的将这个框架给啃透。

   第一个要讲的是磁盘的缓存的接口DiskCache

   首先看一下当中的核心的接口的代码:

  

File getDirectory();	File get(String imageUri);	boolean save(String imageUri, InputStream imageStream, IoUtils.CopyListener listener) throws IOException;	boolean save(String imageUri, Bitmap bitmap) throws IOException;	boolean remove(String imageUri);	void close();	void clear();
 通过以上的代码。发现磁盘缓存的接口无非是包括这个几方面的内容

 1、获取当前的磁盘缓存的根文件夹

2、通过指定的图片的uri来获取当前的图片缓存所相应的实体的文件

3、将文件流保存到磁盘中,当中相应的參数包含:1、uri2、文件的流 3、当前的流写入的进度与状态的观察者

4、保存Bitmap的视图的对象到磁盘中

5、有缓存图片就必定有删除图图片文件。就如同有阴就有阳一样。删除图片的參数是uri

6、关闭当前的磁盘的流,释放操作的时候所创建的相关的资源

7、最后一个就是清除磁盘缓存

  第二个要讲的就是实现磁盘缓存的接口的类了。

在这一讲里面主要是要关注3个类。各自是:BasicDiskCache、LimitedAgeDiskCache与UnLimitedAgeDiskCache。

  咱们还是依照逻辑的顺序来先分析一下实现磁盘缓存的抽象类BasicDiskCache。

  为了精简一下,先分析当中的成员变量,相信对当中的暂时变量的解说也是能够对其总体的功能进行了解。

 

public static final int DEFAULT_BUFFER_SIZE = 32 * 1024; // 32 Kb	public static final Bitmap.CompressFormat DEFAULT_COMPRESS_FORMAT = Bitmap.CompressFormat.PNG;	public static final int DEFAULT_COMPRESS_QUALITY = 100;	private static final String ERROR_ARG_NULL = " argument must be not null";	private static final String TEMP_IMAGE_POSTFIX = ".tmp";	protected final File cacheDir;	protected final File reserveCacheDir;	protected final FileNameGenerator fileNameGenerator;	protected int bufferSize = DEFAULT_BUFFER_SIZE;	protected Bitmap.CompressFormat compressFormat = DEFAULT_COMPRESS_FORMAT;	protected int compressQuality = DEFAULT_COMPRESS_QUALITY;
   也就是说其成员变量是:1、默认的缓冲区的尺寸 2、默认的图片的压缩的格式是PNG 3、默认的压缩的质量是100 4、包含暂时的图片文件的缓存的命名 5、缓存文件的文件夹 6、缓存的文件的备胎的文件夹  7、文件的名称命名生成器

   为了让大家更好的了解。咱们再拿当中的一个保存图片字节流的方法来讲一下吧:

 

@Override	public boolean save(String imageUri, InputStream imageStream, IoUtils.CopyListener listener) throws IOException {		//分析是怎样保存的		//创建一个空的文件		File imageFile = getFile(imageUri);		//创建一个暂时的文件		File tmpFile = new File(imageFile.getAbsolutePath() + TEMP_IMAGE_POSTFIX);		//默认当前还是没有进行载入				boolean loaded = false;		try {			//以暂时文件创建输入流的对象			OutputStream os = new BufferedOutputStream(new FileOutputStream(tmpFile), bufferSize);			try {				//当前是正在拷贝相应的图片				loaded = IoUtils.copyStream(imageStream, os, listener, bufferSize);			} finally {				IoUtils.closeSilently(os);			}		} finally {			if (loaded && !tmpFile.renameTo(imageFile)) {				loaded = false;			}			if (!loaded) {				tmpFile.delete();			}		}		return loaded;	}
从以上的代码中,我们知道 会创建一个暂时缓存图片的文件,根据的參数是uri,然后利用工具类的方法将输入流复制到输出流中。

接下来须要说明的是有限的生命周期的磁盘的缓存LimitedAgeDiskCache

相对于抽象类而言,当前的类的成员变量新添加了两个:

//文件的最大的寿命	private final long maxFileAge;	//当中的每个文件都相应的是一个寿命的日期	private final Map
loadingDates = Collections.synchronizedMap(new HashMap
());
当中的文件的缓存的最大的时间maxFileAge的单位是秒,  而相应的HashMap的作用则是缓存图片文件所相应的载入的时间。

能够略微的关注一下在这个类中缓存文件载入的时间的函数

private void rememberUsage(String imageUri) {		//首相创建文件的句柄		File file = getFile(imageUri);		//获取当前的时间		long currentTime = System.currentTimeMillis();		//记住改动的时间		file.setLastModified(currentTime);		//放到内存中		loadingDates.put(file, currentTime);	}
相对于有缓存的时间限制的LimitedAgeDiskCache,UnlimitedDiskCache显然更好理解一些,与其父类抽象类是一样的。也就不再赘述。

 

转载地址:http://vhqal.baihongyu.com/

你可能感兴趣的文章
基础权限管理
查看>>
navicat for mysql快捷键
查看>>
PHP中设置时区方法小结
查看>>
netty源码分析
查看>>
linux-2.6内核驱动学习——jz2440之输入子系统
查看>>
Sizeof与Strlen的区别与联系
查看>>
Hadoop- NameNode和Secondary NameNode元数据管理机制
查看>>
python中socket模块详解
查看>>
Android 四大组件 (三) BroadcastReceiver 介绍
查看>>
一个友盟BUG的思考和分析:Invalid update
查看>>
读取对象
查看>>
切换带空格的目录下
查看>>
Nginx 在ubuntu14.04下的安装
查看>>
51nod 1100:斜率最大
查看>>
简单工厂模式(C++)
查看>>
关于Java中的Arrays.copyOfRange()方法
查看>>
正确地黑C
查看>>
一个程序员的自白(三十而立)
查看>>
生产者、消费者、队列
查看>>
关于java中的==,equal,new,= 的一些相关知识(有点乱)
查看>>