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

参考阅读:

Glide多种组合使用方式记录–没有全部亲测,大家可以根据实际需要选用
Glide设计模式之工厂模式1【ModelLoaderFactory】
Glide设计模式之工厂模式2【DiskCache.Factory】
Glide工厂模式3【TransitionFactory】【Transition】
Glide设计模式之工厂模式4总结

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算法(先挖个坑)

更多

单例模式
Glide设计模式之单例模式
空对象模式
Glide设计模式之空对象模式【EmptyModelLoader】【EmptyList<E>
建造者模式
Glide多种组合使用方式记录–没有全部亲测,大家可以根据实际需要选用
Glide设计模式之建造者(builder)模式1【GlideBuilder】
Glide设计模式之建造者(builder)模式2【RequestBuilder】
Glide设计模式之建造者(builder)模式3【RequestOptions】【BaseRequestOptions】
Glide设计模式之建造者(builder)模式4总结【MemorySizeCalculator】【GlideExecutor】【PreFillType】【LazyHeaders】
工厂模式
Glide设计模式之工厂模式1【ModelLoaderFactory】
Glide设计模式之工厂模式2【DiskCache.Factory】
Glide工厂模式3【TransitionFactory】【Transition】
Glide设计模式之工厂模式4总结

自研产品推荐

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

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

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

下载地址:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lichong951

你的鼓励决定更新的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值