zoukankan      html  css  js  c++  java
  • Android ImageLoader 本地缓存

    Android ImageLoader 本地缓存


    本地缓存  
                                                                                
    在缓存文件时对文件名的改动提供了两种方式,每一种方式相应了一个Java类

    1)  HashCodeFileNameGenerator,该类负责获取文件名的hashcode然后转换成字符串。
    2)  Md5FileNameGenerator,该类把源文件的名称同过md5加密后保存。

    两个类都继承了FileNameGenerator接口

    在DefaultConfigurationFactory类中提供了一个工厂方法createFileNameGenerator,该方法返回了一个默认的FileNameGenerator对象:HashCodeFileNameGenerator.

    public static FileNameGenerator createFileNameGenerator() {  
            return new HashCodeFileNameGenerator();  
        }
    实现                                                                                   

    首先定义了DiscCacheAware接口,该接口提供了例如以下方法
    File  getFileDectory()   返回磁盘缓存的根文件夹 File  get(String imageUri)  依据uri从缓存中获取图片 boolean  save(String  imageUri,InputStream iamgeStream,IoUtils.CopyListener listener)  把图片保存在磁盘缓存上 boolean  save(String  imageUri,Bitmap bitmap)  保存bitmap对象到磁盘缓存上 boolean  remove(imageUri)  依据imageUri删除文件 void  close()  关闭磁盘缓存,释放资源 void  clear()  清空磁盘缓存

    然后定义了另外一个没方法的接口DiskCache,该接口仅仅是简单的继承了DiscCacheAware接口。

    BaseDiscCache实现了DiskCache,该类是个抽象类,该类定义了磁盘缓冲区的下面的属性:

    1)  默认的缓存大小为32k
    2)  默认压缩后的图片格式为PNG(作为Bitmap的compress方法的第一个參数)
    3)  默认压缩后图片显示的质量为100。也就是压缩率为0。不进行压缩(作为compress的第二个參数)

    提供了改动压缩图片格式和压缩率以及改动缓存大小的set方法。

    同一时候该类还封装了下面三个属性

    protected final File cacheDir;//缓存文件的保存Directory
    protected final File reserveCacheDir;//后备缓存的Diectory,当cacheDir不存在的情况下就是用reserveCahceDir后备缓存
    protected final FileNameGenerator fileNameGenerator;//文件名称名称生成器

    构造函数 

    public BaseDiscCache(File cacheDir) {
            this(cacheDir, null);
        }
    public BaseDiscCache(File cacheDir, File reserveCacheDir) {
            this(cacheDir, reserveCacheDir, DefaultConfigurationFactory.createFileNameGenerator());
        }
    
    public BaseDiscCache(File cacheDir, File reserveCacheDir, FileNameGenerator fileNameGenerator) {
            if (cacheDir == null) {
                throw new IllegalArgumentException('cacheDir' + ERROR_ARG_NULL);
            }
            if (fileNameGenerator == null) {
                throw new IllegalArgumentException('fileNameGenerator' + ERROR_ARG_NULL);
            }
    
            this.cacheDir = cacheDir;
            this.reserveCacheDir = reserveCacheDir;
            this.fileNameGenerator = fileNameGenerator;
        }
    1)  仅仅有一个參数的构造函数仅仅初始化了cacheDir,没实用到后备缓存,且是以HashCodeFileNameGenerator来生成目标文件的文件名称。
    2)  两个參数的构造器除了cacheDir和HashCodefileNameGenerator外,也能够初始化后备缓存
    3)  三个參数的构造器要求必须初始化cacheDir而且必须初始化filenNameGenerator否则就报异常

    get(String imageUri)      

    protected File getFile(String imageUri) {  
            String fileName = fileNameGenerator.generate(imageUri);  
            File dir = cacheDir;  
            if (!cacheDir.exists() && !cacheDir.mkdirs()) {  
                if (reserveCacheDir != null && (reserveCacheDir.exists() || reserveCacheDir.mkdirs())) {  
                    dir = reserveCacheDir;  
                }  
            }  
            return new File(dir, fileName);  
        }

    save(String imageUri, Bitmap bitmap)   

    public boolean save(String imageUri, Bitmap bitmap) throws IOException {  
            //获取imageUri的File对象。该对象封装了缓存路径和图片保存后的名称  
            File imageFile = getFile(imageUri);  
            //获取暂时保存文件的tmpFile对象  
            File tmpFile = new File(imageFile.getAbsolutePath() + TEMP_IMAGE_POSTFIX);  
              
            OutputStream os = new BufferedOutputStream(new FileOutputStream(tmpFile), bufferSize);  
            boolean savedSuccessfully = false;  
            try {  
                //调用compress把bitMap压缩到tempFile中  
                savedSuccessfully = bitmap.compress(compressFormat, compressQuality, os);  
            } finally {  
                IoUtils.closeSilently(os);  
                //假设保存成功而且tempFile的文件没有成功移动到imageFile的话,就删除temFile  
                if (savedSuccessfully && !tmpFile.renameTo(imageFile)) {  
                    savedSuccessfully = false;  
                }  
                if (!savedSuccessfully) {  
                    tmpFile.delete();  
                }  
            }  
            //对bitmap进行垃圾回收  
            bitmap.recycle();  
            return savedSuccessfully;  
        }

    BaseDiscCache有两个扩展类,一个是不限制缓存大小的UnlimitedDiscCache和限制缓存时间的LimitedAgeDiscCache,当中UnlimitedDiscCache非常easy它仅仅是简单的继承了BaseDiscCache并未对BaseDiscCache做不论什么扩展。

    LimitedAgeDiscCache该类实现了在缓存中删除被载入超过规定时间的文件:满足下面条件的时候就从缓存中删除文件:系统当前时间-文件的最新改动时间 > maxFileAge

    LimitedAgeDiscCache         &

  • 相关阅读:
    继承Runnable 实现Synchronized 同步锁
    SSM框架整合(IntelliJ IDEA + maven + Spring + SpringMVC + MyBatis)
    Nginx采用yum安装-Carr
    SpringBoot idea maven打包war及运行war包
    根据现有PDF模板填充信息(SpringBoot)
    java后台简单从腾讯云下载文件通知前端以附件的形式保存
    java后台简单从阿里云上传下载文件并通知前端以附件的形式保存
    Security-OAuth2.0 密码模式之客户端实现
    Security-OAuth2.0 密码模式之服务端实现
    Redis-Java 交互的应用
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/6959044.html
Copyright © 2011-2022 走看看