首页 > 编程语言 >Glide源码阅读之工厂模式2【DiskCache.Factory】

Glide源码阅读之工厂模式2【DiskCache.Factory】

时间:2023-09-19 11:35:12浏览次数:45  
标签:缓存 Glide cache Factory 源码 bumptech 磁盘 disk com


DiskCache.Factory

包路径:com.bumptech.glide.load.engine.cache.DiskCache
com.bumptech.glide.load.engine.cache.DiskCache.Factory

/** An interface for writing to and reading from a disk cache. */
一种向磁盘缓存写入和从磁盘缓存读取数据的接口。
public interface DiskCache {

  /** An interface for lazily creating a disk cache. */
  接口惰性创建磁盘缓存。
  interface Factory {
    /** 250 MB of cache. */
    int DEFAULT_DISK_CACHE_SIZE = 250 * 1024 * 1024;

    String DEFAULT_DISK_CACHE_DIR = "image_manager_disk_cache";

    /** Returns a new disk cache, or {@code null} if no disk cache could be created. */
    返回一个新的磁盘缓存,如果不能创建磁盘缓存,则返回null。
    @Nullable
    DiskCache build();
  }

下面是实现列表

  • DiskCacheAdapter.Factory
  • DiskLruCacheFactory
  • ExternalCacheDiskCacheFactory
  • ExternalPreferredCacheDiskCacheFactory
  • InternalCacheDiskCacheFactory

DiskCacheAdapter.Factory

包路径:com.bumptech.glide.load.engine.cache.DiskCacheAdapter.Factory

/** Default factory for {@link DiskCacheAdapter}. */
DiskCacheAdapter的默认工厂。
目前没有被调用
  public static final class Factory implements DiskCache.Factory {
    @Override
    public DiskCache build() {
      return new DiskCacheAdapter();
    }
  }

DiskLruCacheFactory

包路径:com.bumptech.glide.load.engine.cache.DiskLruCacheFactory

/**
 * Creates an {@link com.bumptech.glide.disklrucache.DiskLruCache} based disk cache in the specified
 * disk cache directory.
 *
 * <p>If you need to make I/O access before returning the cache directory use the {@link
 * DiskLruCacheFactory#DiskLruCacheFactory(CacheDirectoryGetter, long)} constructor variant.
 */
 在指定的磁盘缓存目录下创建基于diskrucache的磁盘缓存。
如果你需要在返回缓存目录之前进行I/O访问,请使用DiskLruCacheFactory(CacheDirectoryGetter, long)构造函数变量。
// Public API.
@SuppressWarnings("unused")
public class DiskLruCacheFactory implements DiskCache.Factory {
。。。

很明显 这里有一个Lru(Least Recently Used)算法。这个在后面的篇章里会详细说明,让大家能做到看完LRU算法解析后能手写一个内存Lru算法过程。

ExternalCacheDiskCacheFactory

包路径: com.bumptech.glide.load.engine.cache.ExternalCacheDiskCacheFactory

/**
 * Creates an {@link com.bumptech.glide.disklrucache.DiskLruCache} based disk cache in the external
 * disk cache directory.
 *
 * <p><b>Images can be read by everyone when using external disk cache.</b>
 *
 * @deprecated use {@link ExternalPreferredCacheDiskCacheFactory} instead.
 */
 在外部磁盘缓存目录中创建基于DiskLruCache的磁盘缓存。
当使用外部磁盘缓存时,每个人都可以读取图像。
@deprecated使用{@link ExternalPreferredCacheDiskCacheFactory}代替。
// Public API.
@SuppressWarnings({"unused", "WeakerAccess"})
@Deprecated
public final class ExternalCacheDiskCacheFactory extends DiskLruCacheFactory {
。。。

已停用了,还是看ExternalPreferredCacheDiskCacheFactory

ExternalPreferredCacheDiskCacheFactory

包路径:com.bumptech.glide.load.engine.cache.ExternalPreferredCacheDiskCacheFactory

/**
 * Creates an {@link com.bumptech.glide.disklrucache.DiskLruCache} based disk cache in the external
 * disk cache directory, which falls back to the internal disk cache if no external storage is
 * available. If ever fell back to the internal disk cache, will use that one from that moment on.
 *
 * <p><b>Images can be read by everyone when using external disk cache.</b>
 */
 在外部磁盘缓存目录中创建一个基于DiskLruCache的磁盘缓存,如果没有外部存储可用,则返回到内部磁盘缓存。如果曾经退回到内部磁盘缓存,将从那一刻起使用那一个。
当使用外部磁盘缓存时,每个都可以读取图像。
// Public API.
@SuppressWarnings({"unused", "WeakerAccess"})
public final class ExternalPreferredCacheDiskCacheFactory extends DiskLruCacheFactory {
。。。

这个代码量不多。就不占字数了

InternalCacheDiskCacheFactory

包路径:com.bumptech.glide.load.engine.cache.InternalCacheDiskCacheFactory

/**
 * Creates an {@link com.bumptech.glide.disklrucache.DiskLruCache} based disk cache in the internal
 * disk cache directory.
 */
 在内部磁盘缓存目录中创建一个基于DiskLruCache的磁盘缓存。
// Public API.
@SuppressWarnings({"WeakerAccess", "unused"})
public final class InternalCacheDiskCacheFactory extends DiskLruCacheFactory {

小计

这个工厂模式的实现并不算复杂
通过接口定义磁盘缓存业务。
DiskLruCacheFactory实现算法定义
根据环境或设置选择磁盘位置Internal或External。

扩展

作者是再想大家搞应用开发应该都下载过一些文件或者图片什么的,或者有些日志文件等文件存储。这部分功能模块应该具备通用性。可以借鉴这块实现自己的文件缓存管理功能模块。这样顺便练习Lru算法哦!模块写的好记得开源留言一下。和大家一起践行拿来即用主义。

面试

硬着头皮刷算法,在面试的时候还真不一定被用到。但是Lru作为android开发肯定会知道的(如果不知道那你可以把薪资要求提高5k没有毛病)。这个拿出来和技术面试官嗨上十多分钟没有问题。Lru算法在Android里很有聊头的。磁盘、内存、CPU、线程等等都可以用到的。

附录1 手写LRU算法(先挖个坑)

自研产品推荐

历时一年半多开发终于smartApi-v1.0.0版本在2023-09-15晚十点正式上线
smartApi是一款对标国外的postman的api调试开发工具,由于开发人力就作者一个所以人力有限,因此v1.0.0版本功能进行精简,大功能项有:

  • api参数填写
  • api请求响应数据展示
  • PDF形式的分享文档
  • Mock本地化解决方案
  • api列表数据本地化处理
  • 再加上UI方面的打磨

为了更好服务大家把之前的公众号和软件激活结合,如有疑问请大家反馈到公众号即可,下个版本30%以上的更新会来自公众号的反馈。

嗯!先解释不上服务端原因,API调试工具的绝大多数时候就是一个数据模型、数据处理、数据模型理解共识的问题解决工具,所以作者结合自己十多年开发使用的一些痛点来打造的,再加上服务端开发一般是面向企业的,作者目前没有精力和时间去打造企业服务。再加上没有资金投入所以服务端开发会滞后,至于什么时候会进行开发,这个要看募资情况和用户反馈综合考虑。虽然目前国内有些比较知名的api工具了,但作者使用后还是觉得和实际使用场景不符。如果有相关吐槽也可以在作者的公众号里反馈蛤!

下面是一段smartApi使用介绍:

Glide源码阅读之工厂模式2【DiskCache.Factory】_java

下载地址:

https://pan.baidu.com/s/1kFAGbsFIk3dDR64NwM5y2A?pwd=csdn


标签:缓存,Glide,cache,Factory,源码,bumptech,磁盘,disk,com
From: https://blog.51cto.com/u_16264967/7523837

相关文章

  • Glide源码阅读之工厂模式1【ModelLoaderFactory】【ModelLoader】
    使用场景介绍摘自菜鸟教程|设计模式|工厂模式意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。主要解决:主要解决接口选择的问题。何时使用:我们明确地计划不同条件下创建不同实例时。如何解决:让其子类实现工厂接口,返回的也是一个......
  • Glide源码阅读之建造者(builder)模式3【RequestOptions】【BaseRequestOptions】
    官方定义本来解析完GlideBuilder、RequestBuilder就已经觉得建造者模式用的变化有些大了,但随着解析的进行发现还要下面的这两种变种应用。先解析出来给大家看看,说不定在某些场景下能启发读者使用这种模式应用方式builder模式应用变化一结构:publicstaticRequestOptionssizeXXXX(p......
  • 万字长文深度解读Java线程池,硬核源码分析
    前言本文将深入分析Java线程池的源码,包括线程池的创建、任务提交、工作线程的执行和线程池的关闭等过程。通过对线程池源码的解析,我们能够更好地理解线程池的原理和机制,为我们在实际开发中合理使用线程池提供指导。文章内容较长,建议找个安静的环境慢慢细读,由于线程池涉及的内容......
  • 云HIS医院信息化管理系统源码:集团化管理,多租户机制,满足医院业务需求
    随着云计算、大数据、物联网等新兴技术的迅猛发展,HIS模式的理念、运行机制更新,衍生出了新的HIS模式——云HIS。云HIS是基于云计算、大数据、互联网等高新技术研发的医疗卫生信息平台,它实现了医院信息化从局域网向互联网转型,并重新定义了医疗卫生信息化建设的理念、框架、功能以及运......
  • qemu源码分析(6)--Apple的学习笔记
    一,前言由于看到了类似的写法,都用到了object_dynamic_cast_assert函数,所以分析下。二,源码分析看到如下代码的写法,很眼熟CortexMBoardState*board=CORTEXM_BOARD_STATE(machine);machine的类型是MachineState*#defineCORTEXM_BOARD_STATE(obj)\OBJECT_CHECK(CortexMBoardSt......
  • 如何给OpenWrt的源码打patch
    如何给OpenWrt的源码打patch目录如何给OpenWrt的源码打patch给package打patch给kernel打patch给package打patchOpenWrt有成熟的打patch机制,可以直接从服务器download源码,校验后,再结合自己开发的patch,打上,然后编译。开发环境:基于Ubuntu14.0432bit主机,编译demo_board机型。需......
  • [SpringSecurity5.6.2源码分析十一]:CorsFilter
    前言• 跨域:两个域名的(协议、域名/ip、端口)有任意一个不同即视为跨域• 跨域资源共享(Cors):即浏览器允许访问其他跨域的资源• 而CorsFilter就是SpringSecurity用来处理Cors的过滤器1.CorsConfigurer• CorsConfigurer是CorsFilter对应的配置类,其中就只有一个重要方法• co......
  • 人人都能学的数据分析体系课(16周完整版+源码+PDF课件)
    点击下载——人人都能学的数据分析体系课(16周完整版+源码+PDF课件)  提取码:nsep 人人都能学的数据分析体系课(16周完整版+源码+PDF课件),数据也称为观测值,是实验、测量、观察、调查等的结果。数据分析中所处理的数据分为定性数据和定量数据。只能归入某一类而不能用数值进行测度的数......
  • 程序开发:在线报名线下活动小程序源码功能解析
    针对线下活动在线报名场景的小程序,支持在线支付费用以及线下核销。可以应多大多数的线下报名,线上报名客服表单可以定制订单,支持导出报名,支持审核,支持分享,支持分销拓客以及线下核销。WEB+小程序双端管理活动,日常使用更方便,可以随时随地便捷的对活动进行设置管理,支持活动发布、查看收......
  • Django框架高级之DRF部分源码分析
    【一】DRF之请求执行流程和APIView源码分析【二】DRF之Request源码分析【三】DRF之Response源码分析【四】DRF之登录认证源码分析......