glide图片缓存原理,glidecache什么文件夹

glidecache什么文件夹

glide图片缓存原理,glidecache什么文件夹

文章插图
glidecache是系统自带的回收站文件夹,Glidecache文件可以删除,不过删除此文件以后会同时删除手机中缓存的图片,请用户们注意 。这样删除缓存图片将无法找回,它不像拍摄照片那样删除以后会进入回收站 。
手机使用技巧:打开放大手势功能--首先打开手机的“设置”应用,然后点击“智能辅助”选项,然后点击“无障碍”选项,进入后点击“放大手势”选项,之后将“放大手势”功能打开即可 。
华为手势放大手势功能介绍:
1、放大当前界面-快速点击屏幕三次,放大当前界面,再快速点击屏幕三次,恢复当前界面原始尺寸 。请注意,连击屏幕三次并没有取消放大手势功能,该开关仍然开启,只有关闭放大手势开关才能取消该功能 。
2、移动并查看特定区域--在屏幕上拖移两根或更多手指 。
3、调整缩放比例--开合两根或更多手指 。手指分开,放大比例;手指合拢,缩小比例 。
4、暂时放大或缩小当前界面--快速点击三次屏幕并按住,则暂时放大当前界面 。按住屏幕的同时拖移手指,可查看特定区域 。松开手指,恢复当前界面原始尺寸 。
glide图片缓存原理这篇文章给大家介绍下android目前使用比较广泛的一个图片缓存库—Glide,这个库是google的一位开发人员在github上的一个开源项目 。目前google的一些官方应用都在使用它,所以你现在就开始放心的用吧 。
github地址
Glide基础用法加缓存
添加Glide
在module的build.gradle中添加以下依赖:
compile 'com.github.bumptech.glide:glide:3.7.0'
/** 250 MB of cache. */
int DEFAULT_DISK_CACHE_SIZE = 250 * 1024 * 1024;
Glide.get(this).clearMemory();
Glide.get(MainActivity.this).clearDiskCache();
public class WangGlideModule implements GlideModule {
}
【glide图片缓存原理,glidecache什么文件夹】...
public class WangGlideModule implements GlideModule {
}
public class WangGlideModule implements GlideModule {
}
public class WangGlideModule implements GlideModule {
}
public class WangGlideModule implements GlideModule {
}
public class WangGlideModule implements GlideModule {
}
public class WangGlideModule implements GlideModule {
}
public class WangGlideModule implements GlideModule {
运行后手机文件夹里面多出来一个GlideDisk文件夹,这个就是磁盘缓存的目录
安卓jar包在哪在工程目录下,在main文件夹下,新建一个libs文件夹,然后将jar包复制到这个路径,点击jar包,右键点击add as library就行了 。
glide的缓存机制阅读本文需要先了解 Glide加载流程
首先介绍一下Glide中对图片资源的封装类: EngineResource
在活动缓存中,使用了一个map用来存放EngineResource对象,这里需要注意一个操作,就是这个EngineResource对象是用WeakReference包裹的,并且通过ReferenceQueue监听了EngineResource的回收,在回收的时候会清理当前的活动缓存内容;
下面分析一下源码是如果实现的:
首先,自定义一个WeakReference类,将key和resource传进入(用于在WeakReference回收的时候释放),传入一个ReferenceQueue对象,用于监听WeakReference回收
开启一个子线程,在循环中监听ReferenceQueue的返回值,通过这个返回值,判断WeakReference有没有回收,监听的方法是ReferenceQueue.remove(),这是一个阻塞方法;所以要开子线程;
LruResourceCache继承了LruCache类,关于LruCache类,简单提一下,具体的可以参考我之前的博客 LruCache实现 ,LruCache继承了LinkedHashMap,LinkedHashMap有一个特点,就get后的数据会移动到队列,这就是Lru思想:固定一个容量,put的时候如果超过容量了,将最后一个节点删除,get的时候将get的这个节点移动到队列的头部;
onItemEvicted()方法是LruCache的一个空方法,调用的时机是在put的时候判断是否超过容量,如果超过容量了,就淘汰最后一个节点,并调用这个方法;
活动缓存和内存缓存都是缓存在内存中的,活动缓存缓存的是正在使用的图片资源,当图片不使用时会放到内存缓存中,提出活动缓存的目的:单一的内存缓存由于Lru的淘汰机制会导致图片加载不稳定
首先介绍一个磁盘缓存方案DiskLruCache(非Google官方编写,但获得官方认证),关于这个磁盘缓存方案的理解可以看郭林的这片文章:
Android DiskLruCache完全解析,硬盘缓存的最佳方案
从上一篇文章知道,Glide加载操作是通过 Engine 来驱动的
Engine的load()中,首先尝试从 活动缓存 和 内存缓存 获取缓存,如果没有缓存再启动EngineJob和DecodeJob; 上面介绍了缓存的获取,下面看一下缓存的存放,肯定是在获取到图片后的回调中存放的
在DecodeJob获取到图片数据后,会回调很多接口,在回调中会将其放入 活动缓存 ,当图片不在使用的时候,就会放入内存缓存,根据上面介绍的活动缓存规则,当 EngineResource 计数为0时就应该放入内存缓存;
当资源引用为0,回调onResourceReleased(),从活动缓存移除,放入内存缓存;
上面介绍了活动缓存和内存缓存的存放和获取,下面看一看磁盘缓存的存取;
还记得 DataFetcherGenerator 接口吗?这个接口是DecodeJob用于获取数据的,有三个具体的实现:
我们在上一篇具体介绍的是网络文件的获取,这里的磁盘缓存使用的就是 DataCacheGenerator(缓存文件) 这个Generator了
上篇文章知道DecodeJob是一个Runnable任务,在run()会调用runWrapped(),在runWrapped()中会做三种事情:
在runWrapped()的解码操作中会执行decode(),在decode()中,会disk put操作;
Glide的磁盘缓存是基于DiskLruCache 实现的,Glide直接使用的是DiskLruCacheWrapper对象对DiskLruCache 的封装;

    推荐阅读