详细讲解Android的图片下载框架UniversialImageLoader之磁盘缓存(一)

沉浸在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<File, Long> loadingDates = Collections.synchronizedMap(new HashMap<File, Long>());

其中的文件的缓存的最大的时间maxFileAge的单位是秒,  而对应的HashMap的作用则是缓存图片文件所对应的加载的时间。

可以稍微的关注一下在这个类中缓存文件加载的时间的函数

private void rememberUsage(String imageUri) {
		//首相创建文件的句柄
		File file = getFile(imageUri);
		//获取当前的时间
		long currentTime = System.currentTimeMillis();
		//记住修改的时间
		file.setLastModified(currentTime);
		//放到内存中
		loadingDates.put(file, currentTime);
	}

相对于有缓存的时间限制的LimitedAgeDiskCache,UnlimitedDiskCache显然更好理解一些,与其父类抽象类是一样的。也就不再赘述。

时间: 2024-10-14 10:00:47

详细讲解Android的图片下载框架UniversialImageLoader之磁盘缓存(一)的相关文章

详细讲解Android的图片下载框架UniversialImageLoader之磁盘缓存的扩展(二)

相对于第一篇来讲,这里讲的是磁盘缓存的延续.在这里我们主要是关注四个类,分别是DiskLruCache.LruDiskCache.StrictLineReader以及工具类Util. 接下来逐一的对它们进行剖析.废话不多说. 首先来看一下DiskLruCache. 这个类的主要功能是什么呢?我们先来看一段类的注释: /** * A cache that uses a bounded amount of space on a filesystem. Each cache * entry has a

详细讲解Android图片下载框架UniversialImageLoader之内存缓存(三)

前面的两篇文章着重介绍的是磁盘缓存,这篇文章主要是讲解一下内存缓存.对于内存缓存,也打算分两篇文章来进行讲解.在这一篇文章中,我们主要是关注三个类, MemoryCache.BaseMemoryCache以及LimitedMemoryCache. 首先我们先看一下内存缓存的接口MemoryCache. [java] view plaincopyprint? put(String key, Bitmap value); Bitmap get(String key); Bitmap remove(S

具体解说Android图片下载框架UniversialImageLoader之内存缓存(三)

前面的两篇文章着重介绍的是磁盘缓存,这篇文章主要是解说一下内存缓存.对于内存缓存.也打算分两篇文章来进行解说.在这一篇文章中,我们主要是关注三个类, MemoryCache.BaseMemoryCache以及LimitedMemoryCache. 首先我们先看一下内存缓存的接口MemoryCache. put(String key, Bitmap value); Bitmap get(String key); Bitmap remove(String key); Collection<Strin

详细讲解Android图片下载框架UniversialImageLoader之内存缓存扩展(四)

内存缓存的扩展还是蛮重要的,无论是数据结构还是具体的实现还是值得我们进行细细的品味,下面咱们就一起能品味这里面的趣味吧. 内存缓存的扩展主要学习下面的几个类:FIFOLimitedMemoryCache.FuzzyKeyMemoryCache. LargestLimitedMemoryCache.LimitedAgeMemoryCache.LRULimitedMemoryCache. LruMemoryCache.UsingFreqLimitedMemoryCache以及WeakMemoryCa

Android 多线程多任务下载框架的实现(一)

什么是多线程多任务下载框架: Android 多线程多任务下载框架 封装了一个下载工具类,该下载工具支持多线程下载,下载任务队列,下载进度更新,取消下载等.可用于应用市场app的下载,音乐下载等. 为什么需要多线程多任务下载框架: 我们在开发Android 应用市场的时候需要下载apk,这个时候用户希望能同时下载多个apk并且显示正确的进度条信息,且下载速度快,那么我们就需要多线程多任务下载框架来支持这些功能,来达到很好的用户体验. 怎么实现多线程多任务下载框架: 涉及到的知识点: 1.线程操作

详细讲解Android的网络通信(HttpUrlConnection和HttpClient)

前言,Android的网络通信的方式有两种:使用Socket或者HTTP,今天这一篇我们详细讲解使用HTTP实现的网络通信,HTTP又包括两种方式编程方式: (1)HttpUrlConnection: (2)HttpClient: 好了,我们直接进行讲解,当然之前也会有一部分有关Android网络通信的其他知识,我们也应该了解. 一.获取网络状态的方法 (1)MainActivity.java中的关键代码 1 2 3 4 5 6 7 8 //网络管理类,可以判断是否能上网,以及网络类型     

猫猫学iOS(五十五)多线程网络之图片下载框架之SDWebImage

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 效果: 代码: - (NSArray *)apps { if (!_apps) { NSArray *dictArray = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"apps.plist" ofType:nil

详细讲解Android对自己的应用代码进行混淆加密防止反编译

1.查看项目中有没有proguard.cfg. 2.如果没有那就看看这个文件中写的什么吧,看完后将他复制到你的项目中. -optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontpreverify -verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -keep publ

Android学习笔记之详细讲解画圆角图片

[java] view plain copy package xiaosi.RoundConcer; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Pain