Android Glide 缓存机制及源码全解_android glide lru,Python面试题及答案

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Python全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Python知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注Python)
img

正文

Glide 内部是使用 LruCache、弱引用和硬盘缓存实现的。

Glide 主要将缓存分为两块内存缓存和硬盘缓存,两种缓存的结合,构成了 Glide 缓存机制的核心。

为何设计出活动缓存

因为内存缓存使用LRU算法,当你使用Gilde加载并显示第一张图片时,后面又加载了很多图片,同时你的第一张图片还在用。这个时候内存缓存根据LRU算法可能会删除你正在使用的第一张照片。这样的后果就是你正在使用的照片找不到,后果就是程序崩溃。

加载流程

流程就是这么个流程下面咱们通过源码加深一下。

Glide源码

加载流程

1.Engine类

负责启动加载并管理活动资源和缓存资源,它里面有个load方法。没错就是提供路径加载图片的方法。

2.load方法

这个方法里面满满的干货。

public  LoadStatus load(…) {
long startTime = VERBOSE_IS_LOGGABLE ? LogTime.getLogTime() : 0;

EngineKey key =
keyFactory.buildKey(
model,
signature,
width,
height,
transformations,
resourceClass,
transcodeClass,
options);

EngineResource<?> memoryResource;
synchronized (this) {
memoryResource = loadFromMemory(key, isMemoryCacheable, startTime);

if (memoryResource == null) {
return waitForExistingOrStartNewJob(…);
}
}

// Avoid calling back while holding the engine lock, doing so makes it easier for callers to
// deadlock.
cb.onResourceReady(
memoryResource, DataSource.MEMORY_CACHE, /* isLoadedFromAlternateCacheKey= */ false);
return null;
}

3.EngineKey

An in memory only cache key used to multiplex loads.

用于多路传输加载的仅内存缓存密钥.

EngineKey key =
keyFactory.buildKey(
…);

4.loadFromMemory

根据上面load方法提供咱们来看看loadFromMemory()这个是重点;

5.loadFromActiveResources

6.loadFromCache

7.getEngineResourceFromCache

到这里如有还未找到,那就说明该图片未保存至内存缓存中来。咱继续往下走,顺着源码跑。

8.waitForExistingOrStartNewJob

咱弄个简化版

private  LoadStatus waitForExistingOrStartNewJob(…) {
//通过添加和删除加载的回调并通知来管理加载的类
//加载完成时回调。
//咱都没数据肯定没加载完成,这个不管。急着往下看
EngineJob<?> current = jobs.get(key, onlyRetrieveFromCache);
if (current != null) {
current.addCallback(cb, callbackExecutor);
if (VERBOSE_IS_LOGGABLE) {
logWithTimeAndKey(“Added to existing load”, startTime, key);
}
return new LoadStatus(cb, current);
}
//同上,接着向下看
EngineJob engineJob =
engineJobFactory.build(
key,
isMemoryCacheable,
useUnlimitedSourceExecutorPool,
useAnimationPool,
onlyRetrieveFromCache);
//负责从缓存数据或原始源解码资源的类,看着像,咱看看DecodeJob
//应用转换和代码转换。
DecodeJob decodeJob =
decodeJobFactory.build(

engineJob);

jobs.put(key, engineJob);

engineJob.addCallback(cb, callbackExecutor);
engineJob.start(decodeJob);

if (VERBOSE_IS_LOGGABLE) {
logWithTimeAndKey(“Started new load”, startTime, key);
}
return new LoadStatus(cb, engineJob);
}

9.DecodeJob

class DecodeJob
implements DataFetcherGenerator.FetcherReadyCallback,
Runnable,
Comparable<DecodeJob<?>>, Poolable { } ... //构造方法有个DiskCacheProvider看着跟磁盘缓存有关咱进去瞅瞅 DecodeJob(DiskCacheProvider diskCacheProvider, Pools.Pool

10.DiskCacheProvider

磁盘缓存实现的入口。

在指定的内存中创建基于{@link com.bumptech.glide.disklrucache.disklrucache}的磁盘缓存。

磁盘缓存目录。

public class DiskLruCacheFactory implements DiskCache.Factory {
private final long diskCacheSize;
private final CacheDirectoryGetter cacheDirectoryGetter;

/** 在UI线程外调用接口以获取缓存文件夹。 */
public interface CacheDirectoryGetter {
File getCacheDirectory();
}

public DiskLruCacheFactory(final String diskCacheFolder, long diskCacheSize) {
this(
new CacheDirectoryGetter() {
@Override
public File getCacheDirectory() {
return new File(diskCacheFolder);
}
},
diskCacheSize);
}

public DiskLruCacheFactory(
final String diskCacheFolder, final String diskCacheName, long diskCacheSize) {
this(
new CacheDirectoryGetter() {
@Override
public File getCacheDirectory() {
return new File(diskCacheFolder, diskCacheName);
}
},
diskCacheSize);
}

/**
*使用此构造函数时,将调用{@link CacheDirectoryGetter#getCacheDirectory()}
*UI线程,允许在不影响性能的情况下进行I/O访问。
*在UI线程外调用@param cacheDirectoryGetter接口以获取缓存文件夹。
*@param diskCacheSize LRU磁盘缓存所需的最大字节大小。
*/
// Public API.
@SuppressWarnings(“WeakerAccess”)
public DiskLruCacheFactory(CacheDirectoryGetter cacheDirectoryGetter, long diskCacheSize) {
this.diskCacheSize = diskCacheSize;
this.cacheDirectoryGetter = cacheDirectoryGetter;
}

@Override
public DiskCache build() {
File cacheDir = cacheDirectoryGetter.getCacheDirectory();

if (cacheDir == null) {
return null;
}

if (cacheDir.isDirectory() || cacheDir.mkdirs()) {
return DiskLruCacheWrapper.create(cacheDir, diskCacheSize);
}

return null;
}
}

11.DiskCache.Factory

DiskLruCacheFactory实现的接口是什么,咱看看

/** 用于向磁盘缓存写入数据和从磁盘缓存读取数据的接口 */
public interface DiskCache {

/** 用于创建磁盘缓存的接口 /
interface Factory {
/
* 250 MB of cache. */
int DEFAULT_DISK_CACHE_SIZE = 250 * 1024 * 1024;

String DEFAULT_DISK_CACHE_DIR = “image_manager_disk_cache”;

/** 返回新的磁盘缓存,如果无法创建磁盘缓存,则返回{@code null}*/
@Nullable
DiskCache build();
}

/** 向磁盘缓存中的密钥实际写入数据的接口 /
interface Writer {
/
*
*将数据写入文件
*如果写入操作应中止,则返回false。
*@param file写入程序应写入的文件。
*/
boolean write(@NonNull File file);
}

/**
*获取给定键处的值的缓存。
*/
@Nullable
File get(Key key);

如果你也是看准了Python,想自学Python,在这里为大家准备了丰厚的免费学习大礼包,带大家一起学习,给大家剖析Python兼职、就业行情前景的这些事儿。

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注python)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

sdnimg.cn/img_convert/6c361282296f86381401c05e862fe4e9.png)

成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注python)
[外链图片转存中…(img-ZtqTCYGA-1713646891785)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值