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




     


  • 相关阅读:
    element-ui 中 el-table 根据scope.row行数据变化动态显示行内控件
    vue.js 父组件主动获取子组件的数据和方法、子组件主动获取父组件的数据和方法
    把json1赋值给json2,修改json2的属性,json1的属性也一起变化
    win10下当前目录右键添加CMD快捷方式
    element-ui
    vscode 头部注释插件
    IE浏览器new Date()带参返回NaN解决方法
    常用css
    使用DataGridView控件显示数据
    第四章 ADO.NET
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7358568.html
Copyright © 2020-2023  润新知