具体解说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显然更好理解一些,与其父类抽象类是一样的。也就不再赘述。
具体解说Android的图片下载框架UniversialImageLoader之磁盘缓存(一)的更多相关文章
- 具体解说Android的图片下载框架UniversialImageLoader之磁盘缓存的扩展(二)
相对于第一篇来讲,这里讲的是磁盘缓存的延续.在这里我们主要是关注四个类.各自是DiskLruCache.LruDiskCache.StrictLineReader以及工具类Util. 接下来逐一的对它 ...
- 具体解说Android图片下载框架UniversialImageLoader之内存缓存(三)
前面的两篇文章着重介绍的是磁盘缓存,这篇文章主要是解说一下内存缓存.对于内存缓存.也打算分两篇文章来进行解说.在这一篇文章中,我们主要是关注三个类, MemoryCache.BaseMemoryCac ...
- AJ学IOS(55)多线程网络之图片下载框架之SDWebImage
AJ分享,必须精品 效果: 代码: - (NSArray *)apps { if (!_apps) { NSArray *dictArray = [NSArray arrayWithContentsO ...
- Android实现图片下载并保存SD卡
一.首先获取图片 //第一种获取图片的方法 String filePath = downloadUrl; //以下是取得图片的方法 取得的是InputStream,直接从InputStream生成bi ...
- 关于Exceptionless日志收集框架如何关闭磁盘缓存
问题:在使用Exceptionless的时候,Exception在收集到日志时会默认在appdata里面缓存当条日志的缓存文件,时间久了之后,如果收集到的日志越多磁盘的空间就会不足. 我使用的环境是 ...
- 【转】Picasso – Android系统的图片下载和缓存类库
来源:http://blog.chengyunfeng.com/?p=492 另一篇参考:http://blog.csdn.net/xu_fu/article/details/17043231 Pic ...
- Picasso – Android系统的图片下载和缓存类库
Picasso – Android系统的图片下载和缓存类库 Picasso 是Square开源的一个用于Android系统下载和缓存图片的项目.该项目和其他一些下载图片项目的主要区别之一是:使用4.0 ...
- Android常用优秀开源框架
Android常用优秀开源框架 https://github.com/Ericsongyl/AOSF AOSF:全称为Android Open Source Framework,即Android优秀开 ...
- Android图片下载以及缓存框架
实际开发中进行图片下载以及缓存的框架 介绍一下开发中常见图片加载框架的使用和对比一下优缺点. 1.Picasso 框架 在Android中开发,常需要从远程获取图片并显示在客户端,当然我们可以使用原生 ...
随机推荐
- Golang Vendor 包机制 及 注意事项
现在的 Go 版本是 1.8,早在 1.5 时期,就有了 Vendor 包机制,详情可查看博文:“理解 Go 1.5 vendor”. 遇到的问题 个人在使用 Glide 管理 Vendor 包时(附 ...
- TCP选项之SO_RCVBUF和SO_SNDBUF
每个TCP socket在内核中都有一个发送缓冲区和一个接收缓冲区,TCP的全双工的工作模式以及TCP的滑动窗口便是依赖于这两个独立的buffer以及此buffer的填充状态.接收缓冲区把数据缓存入内 ...
- Revit Family API 添加类型
FamilyManager.NewType("");添加新类型,然后设置参数,就是为新类型设置参数. [TransactionAttribute(Autodesk.Revit.At ...
- Revit API创建几何实体Solid并找到与之相交的元素
几何实体的创建方法之一:构成封闭底面,指定拉伸方向与拉伸高度.GeometryCreationUtilities ; , pt.Y - dBoxLength / , pt.Z); ...
- WordPress主题开发实例:显示最新发表文章
实现效果 制作网站的时候,想在页面左栏显示最新发表的文章,如: 一.先开启侧边栏工具,在functions.php加上 $args = array( 'name' => __( '分类侧边栏') ...
- 【LeetCode】- Length of Last Word(最后一个单词的长度)
[ 问题: ] Given a string s consists of upper/lower-case alphabets and empty space characters ' ', retu ...
- Javascript:自己写异步流程编程框架
背景 自从NodeJs出来以后,异步编程便更加系统化和框架话了,为了应对异步编程框架带来的深层嵌套问题,社区也出现了异步流程编程框架,本文主要对异步流程框架做一个简单的解析. 现配代码了 var As ...
- POJ 1135 Domino Effect (Dijkstra 最短路)
Domino Effect Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9335 Accepted: 2325 Des ...
- Java文件管理系统
上一个版本设计参照了 windows 资源管理器的原则,使用了多年.也发现了少许问题,也许是我们应用场景不一样... 目前的设计结合了目前的云概念.目录采用的是虚拟方式和实际的目录无关,只是存在一定的 ...
- SPClaimsUtility.AuthenticateFormsUser 方法的一个小问题
前言 最近,开启了Form认证,发现Form账号前面加空格,或者后面加空格都可以登录站点,但是提示未共享. 解决方法 后来bing了很多帖子,发现大家都遇到过类似的问题,问题是由于SPClaimsUt ...