沉浸在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;
为了让大家更好的了解,咱们再拿其中的一个保存图片字节流的方法来讲一下吧:
@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>());
可以稍微的关注一下在这个类中缓存文件加载的时间的函数
private void rememberUsage(String imageUri) {
//首相创建文件的句柄
File file = getFile(imageUri);
//获取当前的时间
long currentTime = System.currentTimeMillis();
//记住修改的时间
file.setLastModified(currentTime);
//放到内存中
loadingDates.put(file, currentTime);
}
详细讲解Android的图片下载框架UniversialImageLoader之磁盘缓存(一)
原文:http://blog.csdn.net/zhangjiaofa/article/details/41208163