沉浸在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 Kbpublic 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、文件的名称命名生成器

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

@Overridepublic 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显然更好理解一些,与其父类抽象类是一样的。也就不再赘述。






更多相关文章

  1. Android高手进阶教程(二十一)---Android WebView的缓存!!!
  2. Android下文件资源管理器雏形实现
  3. android缓存数据 分析
  4. 阿里Android开发规范:文件与数据库
  5. Cocos2dx播放mp4文件(IOS和Android)
  6. Android——文件存储之外部存储(含源码下载)

随机推荐

  1. android中使用SQLite进行CRUD操作的实例
  2. Android的pagerAdapter源码,在线查看网址
  3. android 图片的浏览、缩放、拖动和自动居
  4. 设置 Toolbar(ActionBar) 上的按钮颜色
  5. android 安装软件
  6. Android(安卓)如何实现屏幕转换方向
  7. Android布局管理器
  8. Android(安卓)System Server
  9. 黑马android - 学习笔记
  10. 2011.08.18——— android 图片效果 Imag