Glide 图片库原理(三)缓存机制

Glide 图片库原理(三)缓存机制,第1张

查找缓存使用

用完移除

源码中查看EngineKey-----相当于key,算法序列abcdsxxfaskldfjklf

源码中查看Source-----相当于value(Bitmap),调用系统转换成Bitmap

情景: 相册类的App经常需要同时展示大量的,这种情况下的质量可以低一点,因为加载速度优先于的质量。

解决办法: 我们可以设置译码的格式,在RequestOptions中加入encodeFormat(BitmapCompressFormatWEBP)encodeQuality(10))的选项,①encodeFormat的参数有BitmapCompressFormatPNG,BitmapCompressFormatJPEG,BitmapCompressFormatWEBP(质量从高到低);②encodeQuality设置的是0-100的int类型,一个质量百分比参数,越小质量越低。

情景: 大体的意思应该是同一个URL在不同的时间可能会指向不同的资源,所以同样需要实时更新。

解决办法相同

情景: 开发一款有头像的APP,我们修改了头像并且更新到了服务端,可是当我们大图时加载出来的还是原来的头像。

解决办法: 这是Glide强大的缓存带来的副作用,我们可以在RequestOptions中加入diskCacheStrategy(DiskCacheStrategyNONE)skipMemoryCache(true)的选项。那么缓存的功能就会全部关闭,从而使得每次都是从服务端加载,所以头像会是最新。

情景: 省流量模式的应用情景就是减少不必要的加载。

解决办法: 我们可以在RequestOptions中加入onlyRetrieveFromCache(true)的选项。那么就只会从缓存中读取,如果没有缓存则不加载,从而达到减少流量消耗的目的。

glide加载框架 其目的帮助我们在开发过程中对控件上的加载减压,它能够通过参数和方法加载 本地 网络 二进制等到控件上 还能够设置预加载以及加载出错时的错误提示,还能够对加载的进行缓存重复利用 可以缓存原始照片还能缓存经过压缩处理后的照片,能够缓存到内存,或者硬盘,甚至glide可以加载GIF动图还可以给加载的静态指定大小,对于 glide的缓存机制它用的是lru 这种缓存机制 其实就是 在一定缓存空间内把最近用的以及重复用的排列在最高级 将最不常用没有重复使用的排在最低级 当有新实例出现,缓存空间不够用的情况下就会把被打有最低级标志的实例释放掉。

很多人不知道安卓手机怎么清理缓存?很多长辈遇到手机内存不足的时候各种束手无策,下面小编就来教一下大家android清除程序缓存的方法,希望对大家有帮助

安卓手机怎么清理缓存 android清除程序缓存的方法

一,系统清除

1、在你手机中“设置->应用程序 >管理应用程序”

2、然后按Menu键“按大小排序”选项 这时会有你手机中所用应用程序

3、选择要清除缓存的软件,就会出现“清除缓存”选项,点击清除缓存这样就会把清除缓存文件占据的空间是放出来。

二、利用RE管理器

软件名称:

RE管理器中文版 for android v317 汉化版 安卓版

软件大小:

199MB

更新时间:

2014-03-09

首先手机要获取过ROOT高级权限

然后安装了RE管理器。

下面就准备开始清理你的手机了

1打开RE管理器。

2打开data / dalivik-cahce

3把dalivik-cache里面的文件全部都删掉,不要犹豫。没错里面的文件是可以全部删除的。

4重启手机,重启的过程中可能会比较慢就像你刷完机后第一次开机一样。

三、其它方法介绍

利用第三方法工具,如有安卓优化大师、ET优化大师、手机优化大师这三款手机优化软件在常规的开机加速、进程管理、程序管理、安装卸载、系统优化清理等常规功能表现都是不错的。

特色功能

安卓优化大师偏向于节电优化、工具箱应用功能拓展;

ET优化大师注重电量管理的同时,也重视快速省电开关的应用;

手机优化大师则具有更灵活的功能插件应用,用户可根据需要下载使用文件管理、桌面管理、系统备份、书签管理等功能。

在图一中右键单击所要修改的包。

然后单击 Refactor --> Rename。

d出对话框,单击 Rename Package。

d出对话框,输入新的包名,单击 Refactor。

5

然后,就可以看到步骤一中单击的包的名称已经改变了。但是AndroidManifest文件中的包名却没改变(小编当时 *** 作是这样的),重新打开项目之后就好了。

DecodeJob的主要工作是从磁盘或者数据源(比如网络)中获取资源,并进行转换和转码。

DecodeJob 实现了 Runnable 接口,它运行在 EngineJob 里面的线程池里。运行时首先会检查是否已经取消了执行,如果没有则执行 runWrapped()。

在 runWrapped() 中首先会判断当前的 runReason ,由于在 init() 中被赋值为 INITIALIZE ,则获取到的 stage 为 StageRESOURCE_CACHE ( Stage 表示当前执行到的阶段)。接着根据当前的 Stage 获取到的 DataFetcherGenerator 为 ResourceCacheGenerator,它用于从磁盘缓存中获取经过转化后的资源。不熟悉这个类的可以看下 Glide源码解析之ResourceCacheGenerator

获取到 DataFetcherGenerator 后就开始将获取数据的 *** 作交给它的 startNext() 来执行,这里我们以 ResourceCacheGenerator 成功获取为例,则 isStarted 会被赋值为 true ,不用进入循环。最终获取的数据会通过 DecodeJob 实现的 FetcherReadyCallback 的 onDataFetcherReady() 回调。

如果 ResourceCacheGenerator 没有获取到数据,由上可知则依次会交给 DataCacheGenerator (原数据的磁盘缓存) 和 SourceGenerator (从数据源加载,比如网络,不熟悉的可以看下 Glide源码解析之SourceGenerator )

在 ResourceCacheGenerator 加载数据成功后则通过 onDataFetcherReady() 回调给 DecodeJob ,由于 ResourceCacheGenerator 并没有切换线程去获取资源,所以会执行到 decodeFromRetrievedData() 去进行解码。经过一系列的调用,最终会将解码的 *** 作交给 LoadPath 去执行。

会遍历 decodePaths 来寻找哪个 DecodePath 是能完成解码工作的,而具体解码由分为三步,第一步为解码资源,第二步为解码之后的工作(实际为对资源进行缓存),第三步为转码,即是将获取到的资源类型转为另一种资源类型。

当资源类型是 ByteBuffer 的时候,对应的 DataRewinder 是 ByteBufferRewinder ,ResourceDecoder 是 ByteBufferBitmapDecoder ,则最终的解码 *** 作将由 ByteBufferBitmapDecoder 来完成。

首先会将 ByteBuffer 转化为 InputStream ,然后再交给 Downsampler来解码。

在解码 *** 作里首先会根据 Bitmap 的宽高和 ImageView 的宽高来计算出缩放值,然后从 BitmapPool 获取一个合适宽高的 Bitmap 交给 BitmapFactory 去进行最终的解码 *** 作,最后再判断是否需要对 Bitmap 进行旋转。

获取到 Bitmap 后将它包装进 BitmapResource 里返回,到此解码资源的工作就完成了。

解码资源完成后接着就轮到编码资源了,由 DecodeCallback (接口) 去执行,在 DecodeJob 的 runLoadPath() 中给callback 赋的值是 DecodeCallback (实现类),而它将具体的编码 *** 作又交回给了 DecodeJob 的 onResourceDecoded()去执行。

首先会判断资源是否可以编码,由上可知资源类型为 Bitmap ,是可以编码的。接着判断是否可以进行缓存,由于这里是从 ResourceCacheGenerator 获取数据的,本来就是从缓存中取得数据,所以不再需要进行缓存,最终会将源数据返回。

如果是需要缓存的则会交给 DeferredEncodeManager 进行磁盘缓存,如果对磁盘缓存不熟悉的可以看下 Glide源码解析之DiskCache

将 Resource<Bitmap> 传进 LazyBitmapDrawableResource ,而 LazyBitmapDrawableResource 有一个 get() 将 Resource<Bitmap> 转化为 BitmapDrawable 。到此数据的获取过程就结束了。

让我们回到 DecodeJob 一开始获取数据的时候,在获取到数据之后通过回调将数据传给 EngineJob 。接着如果需要缓存的则调用 deferredEncodeManager 去执行,最后释放资源。到此 DecodeJob 的使命就全部完成了。

以上就是关于Glide 图片库原理(三)缓存机制全部的内容,包括:Glide 图片库原理(三)缓存机制、Android之 glide 框架 解读、android glide 清理缓存方法,怎么清理缓存等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9497904.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存