分享好友 最新动态首页 最新动态分类 切换频道
android ProgressBar自定义图片加载圈
2024-12-27 00:39


android ProgressBar自定义图片加载圈

在上一篇中,我们知道了 Glide 框架的最基本的执行流程,那么只知道基本执行流程,这显然是不够的,我们要深挖 Glide 框架的细节处理原理,比如缓存机制,图片处理等,这一篇我们就一起去探索 Glide 的缓存机制。

Glide 缓存机制可以说是设计的非常完美,考虑的非常周全,下面就以一张表格来说明下 Glide 缓存。

如果对 Glide 执行流程不明白的可以先看 Android 图片加载框架 Glide 4.9.0 (一) 从源码的角度分析一次最简单的执行流程

在介绍缓存原理之前,先来看一张加载缓存执行顺序,先有个印象。

不管是内存缓存还是磁盘缓存,存储的时候肯定需要一个唯一 key 值,那么 Glide cache key 是怎么生成的?通过上一篇源码加载流程介绍,我们知道在 Engine 的 load 函数中进行对 key 的生成。下面我们就通过代码来看一下。


复制代码

根据注释和代码可以看到传入的参数之多,主要是根据 url ,签名,宽高等,其内部重写了 hashCode,equals,来保证对象的唯一性。

通过下面代码开启内存缓存,当然 Glide 默认是为我们开启了内存缓存所以不需要我们调用 skipMemoryCache

/

}
复制代码

Glide 为什么会设计 2 个内存缓存

不知道大家通过上面代码跟注释(2,3 ) , 有没有发现为什么 Glide 会弄 2 个内存缓存(一个 Map + 弱引用,一个 LRU 内存缓存),大家有没有想过为什么?在看 郭霖大神对 Glide 缓存机制分析 中说道, ,起初当我看见这句话的时候,我是真的很不理解,因为 Lru 是最近最少时候才会回收尾端数据,那么这里的 ,我是越想越觉得矛盾,后来中午吃饭的时候,灵光一闪突然想到了一种情况,我也不知道是不是这样,先看下面一张图。

详细举例说明: 比如我们 Lru 内存缓存 size 设置装 99 张图片,在滑动 RecycleView 的时候,如果刚刚滑动到 100 张,那么就会回收掉我们已经加载出来的第一张,这个时候如果返回滑动到第一张,会重新判断是否有内存缓存,如果没有就会重新开一个 Request 请求,很明显这里如果清理掉了第一张图片并不是我们要的效果。所以在从内存缓存中拿到资源数据的时候就主动添加到活动资源中,并且清理掉内存缓存中的资源。这么做很显然好处是 我也不知道这样理解是否正确,希望如果有其它的含义,麻烦告知一下,谢谢 !

上面我们说到了 Glide 为什么会设计 2 个内存缓存,下面我们就对这 2 个缓存的 存/取/删 来具体说明下。

ActiveResources 活动资源

获取活动资源

通过之前的介绍我们知道,活动缓存是在中获取


复制代码

到了这里我们知道,在清理活动缓存的时候添加进了内存缓存。

清理内存缓存

这里的清理是在获取内存缓存的时候通过 remove 清理掉的,详细可以看内存缓存获取的方式。

内存缓存小结

通过上面分析可知,内存缓存有活动缓存和内存资源缓存,下面看一个图来总结下它们相互之间是怎么配合交换数据的。

总结下步骤:

  1. 第一次加载没有获取到活动缓存。
  2. 接着加载内存资源缓存,先清理掉内存缓存,在添加进行活动缓存。
  3. 第二次加载活动缓存已经存在。
  4. 当前图片引用为 0 的时候,清理活动资源,并且添加进内存资源。
  5. 又回到了第一步,然后就这样环环相扣。

在介绍磁盘缓存之前先看一张表格

上面这 4 中参数其实很好理解,这里有一个概念需要记住,就是当我们使用 Glide 去加载一张图片的时候,Glide 默认并不会将原始图片展示出来,而是会对图片进行压缩和转换,总之就是经过种种一系列操作之后得到的图片,就叫转换过后的图片。而 Glide 默认情况下在硬盘缓存的就是

以下面的代码来开启磁盘缓存:

知道了怎么开启,下面我们就来看一下磁盘缓存的的加载与存储。

这 2 个加载流程几乎一模一样,只是加载的数据源不同,下面我们具体来看一下

DiskCacheStrategy.RESOURCE 资源类型

获取资源数据

通过上一篇Glide 加载流程 我们知道,如果在活动缓存、内存缓存中没有找数据,那么就重新开启一个 GlideExecutor 线程池在 DecodeJob run 执行新的请求,下面我们就直接来看 DecodeJob run 函数,跟着它去找 资源数据的加载:

都说三年是程序员的一个坎,能否晋升或者提高自己的核心竞争力,这几年就十分关键。

技术发展的这么快,从哪些方面开始学习,才能达到高级工程师水平,最后进阶到Android架构师/技术专家?我总结了这 5大块;

我搜集整理过这几年阿里,以及腾讯,字节跳动,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 PDF(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。


Java语言与原理;
大厂,小厂。Android面试先看你熟不熟悉Java语言


高级UI与自定义view;
自定义view,Android开发的基本功。


性能调优;
数据结构算法,设计模式。都是这里面的关键基础和重点需要熟练的。


NDK开发;
未来的方向,高薪必会。


前沿技术;
组件化,热升级,热修复,框架设计


网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

我在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多


Java语言

[外链图片转存中…(img-JP55tbcQ-1715108368321)]

高级UI与自定义view;
自定义view,Android开发的基本功。

[外链图片转存中…(img-1MDchRv3-1715108368323)]

性能调优;
数据结构算法,设计模式。都是这里面的关键基础和重点需要熟练的。

[外链图片转存中…(img-NZ2l34sw-1715108368324)]

NDK开发;
未来的方向,高薪必会。

[外链图片转存中…(img-C1NUW8t5-1715108368325)]

前沿技术;
组件化,热升级,热修复,框架设计

[外链图片转存中…(img-kCoUoZ4E-1715108368326)]

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

我在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多


最新文章
如何通过百度SEO优化提升网站排名增加潜在客户流量
随着互联网技术的不断发展,越来越多的人开始关注网络营销这一领域。无论是个人创业者,还是大型企业,都意识到通过互联网平台推广产品、品牌的重要性。特别是在百度等搜索引擎优化(SEO)方面,如何有效提升自己的网站排名,吸引更多的潜
翼真L380提升幸福感 智能配置和质感都不输大牌
刚步入社会时,收入一般不会太可观,此时一辆经济高性价比的车型往往是最合适的。在与同级别车型的竞争中,在空间表现上值得一说。接下来就和小编一起看看吧。先来看下翼真L380的外观,翼真L380前脸提升了整车的档次,让人过目不忘。头灯非
阴阳师百闻牌输出式神卡牌评分 最强输出单卡排名攻略
在阴阳师百闻牌里,输出类式神是现在最为主流的式神,但它们的单卡的质量并不统一,究竟哪些单卡强度高,应该是我们合卡和抽卡的目标呢?下面就为大家带来详细的攻略介绍,一起来看看吧! 更多攻略点击:阴阳师百闻牌式神大全 这是一篇基于
惠州seo工作室(惠州seo公司)
大家好,今天小编关注到一个比较有意思的话题,就是关于惠州seo工作室的问题,于是小编就整理了1个相关介绍惠州seo工作室的解答,让我们一起看看吧。专业网站建设如何给企业带来最大回报?随着早期互联网的兴起,网站是一个公司的标配,可
第十一章 文件操作_C语言插入、删除、更改文件内容
我们平时所见的文件,例如 txt、doc、mp4 等,文件内容是按照从头到尾的顺序依次存储在磁盘上的,就像排起一条长长的队伍,称为顺序文件。 除了顺序文件,还有索引文件、散列文件等,一般用于特殊领域
微信小程序开发多少钱一个月
在当今互联网飞速发展的时代,微信小程序因其便捷、功能多样和用户量庞大,成为众多企业、商家乃至个体创业者拓展线上业务的重要工具。对于想要开发微信小程序的企业而言,最关心的问题之一就是费用问题。在合肥开发一款微信小程序的费用到
淘宝关键词排名优化怎么做?影响因素有哪些?
标题是淘宝店铺自然搜索流量最重要的入口,如果宝贝的标题没有做好,那么后续的运营也就没有什么意义了。想要获取自然搜索流量,那么标题的关键词就得有权重,有排名。一、淘宝标题关键词如何优化靠前?首先,搜索引擎会先抓取大热词,大热
转:Sql 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介
https://www.cnblogs.com/52xf/p/4209211.html    附上表结构和初始数据图:用法: 一:语法(用法):      rank() over([partition by col1] order by col2)      dense_rank() over([partition by col
相关文章
推荐文章
发表评论
0评