1.求slip ,slide和glide 区别
2.imageload和glide的区别
3.Glide 样率 inSampleSize 计算
4.Glide的使用&GlideAPP怎么来的
5.Android 手撕Glide--Glide缓存机制(面试)
6.glide优缺点
下滑英语glide
有关例句
1、The plane?managed?to?glide?down?to?the runway.?
飞机终于成功地滑翔降落在跑道上。
2、Do you?think?we?can?glide?down?this glacier
你觉得我们可以从冰河上滑行下去吗?
3、Boys?like?to?glide?down?banisters.?
男孩子喜欢从楼梯扶手上往下滑。
4、The pilot?managed to?glide?down?to a?safe?landing.?
驾驶员设法使飞机滑行下降安全着陆。
5、Allow?the air?to?glide?down?your windpipe?as if it's filling?your abdomen.?
让空气滑入气管,慢慢充满腹部。
6、The?gecko?has a patagium that?allows it?to?parachute?or?glide?down?from?its treetop home.?
这种壁虎拥有翼膜,可以让自己从树顶的巢降落或滑翔下去。
7、While Tourists?put on skis?or?sit?in?the sleigh,?conveniently?glide?down?from?the top of the slope,?along?the trial, their keen?interest?will naturally?arise, and it is?infinitely?enjoyable.?
旅游者登上滑雪板或坐上雪橇,从坡顶沿滑道顺势滑下,兴趣油然而生,其乐无穷。
求slip ,slide和glide 区别
在 Glide解析一:Glide整体流程 中,Glide的初始通过Glide.get()方法实现,我们看下其源码:
Glide通过checkAndInitializeGlide方法,检测是否已经初始化,如果还未初始化,则先构建Glide并初始化Glide
Glide的初始化主要有以下步骤:
其核心就是反射创建GeneratedAppGlideModuleImpl实现类,而GeneratedAppGlideModuleImpl只是我们自定义的AppGlideModule的,其他内部都是调用自定义的AppGlideModule的方法。
动态生成Manifest定义的GlideModule显示解析Manifest并创建定义的GlideModule,相比之解的方式少了解析Manifest的步骤,所以注解的方式相对比较高效。
步骤1中,Glide是通过GlideBuilder进行构建的,我们看下GlideBuilder的build实现
GlideBuilder在不指定线程池、缓存策略等的情况下,默认为我们创建了网络加载线程池、磁盘缓存加载线程池、动画线程池、Bitmap池(用于复用)、数组池(用于复用)、内存缓存、磁盘缓存、加载引擎等。然后再创建Glide。
一些相关的点请具体看:
Glide解析九:MemorySizeCalculator的用途
Glide解析十:Bitmap是如何复用的
Glide解析十一:数组是如何复用的
步骤2中创建Glide是在GlideBuilder的build方法new处理的,我们看下new Glide时,Glide的构造方法都做了哪些事情:
总结一下Glide初始化的流程:
这里Glide的初始化主要使用单例、构建等设计模式
imageload和glide的区别
slip,slide,glide都有“滑动”或“滑”的意思。
1).slip 所表示的“滑”与slide相比,接触面更滑,但不象slide那样持续地滑动,而是突然的或短暂的滑动,如滑倒。用于比喻时,可以表示“口误”(a slip of the tongue),“笔误”(a slip of the pen);“悄悄地溜进……”(slip into…)“轻巧而迅速地穿过”(slip through)等等。
2) slide所表示的“滑动”含有这样几层意思:光滑的面接触,通常为加速运动。用于比喻时,表示不自主地陷入某种习惯等。
(3) glide 可以像slide那样持续地滑,但不一定像slide那样以面接触进行滑动。鸟在天空中翱翔,小船在水面荡漾,都可以用glide表示。
Glide 样率 inSampleSize 计算
区别是:
image load指的是图像加载。
glide指的是滑行,滑翔;滑音,延音;流逝,消逝。
例句辨析:
image load
1、You can now interact with GRUB to define the specific kernel and initrd image to load.
我们现在可以与GRUB进行交互,从而定义要加载哪个内核和initrd映像文件。
2、However, you do need to add an attribute: the src attribute, which specifies theimage to load.
但是需要增加一个属性src,它指定了要加载的。
3、A hundred components using the same image will load faster than an licationthat has two components using two images.
与含有两个使用两种不同图像的组件的应用程序相比,使用相同图像的100个组件装载起来要更快一些。
glide
1、Chances are the pilot was not getting dependable glide slope data.
飞行员错过了设定可靠的下滑道数据的大好机会。
2、Give me an Arc Glide self-destruct sequence.
给我一个弧光战机的自毁程序。
3、Marine and freshwater fishes closely related to the flying fishes but notable to glide.
飞鱼是近亲的海洋和淡水鱼类,但不能滑行。
Glide的使用&GlideAPP怎么来的
DownsampleStrategy 策略 抽象类,Glide 提供以下 六种 策略。
默认 CenterOutside。
根据源宽高,和目标展示请求的宽高,计算一个 scale 比例。
FitCenter 策略
计算 requested 宽/高和 source 宽/高的比例,最小值选择。
如果 requested 都小,按照最大 scale 选择 样率。
CenterOutside 策略
和 FIT_CENTER 相反。
如果 requested 都小,返回值<1。按照最小 scale 选择 样率,即 source 和 request 比例最接近的。
AtLeast 策略
计算 source 宽/高 和 request 宽/高 比例,最小值 minIntegerFactor。
如果 minIntegerFactor 是0,表示至少一项 source 小于 requested,按照 1 等比返回。
source 都大时,minIntegerFactor 不是0,是最接近比例。
Integer highestOneBit() 方法,返回<=该值的一个2的幂次方数,(例,如果是3,则返回2。),最终 返回比依然是 request / source。
AtMost 策略
source 宽/高 和 request 宽/高 比例,选择最大值,向上取整 maxIntegerFactor。
返回<= maxIntegerFactor 一个2的幂次方数 lesserOrEqualSampleSize。
如果取幂时变小,<< 翻倍操作,尽可能大。最终 返回比依然是 request / source。
CenterInside 策略
依赖 FIT_CENTER。
如果 FIT_CENTER 的 min 值 >1,说明 requested 宽高都大的情况,按照 1等比返回。
否则,按照 FIT_CENTER 值返回。
None 策略
不做处理,以 1f 等比返回。
SampleSizeRounding 表示选择 向上提高样率 降低内存使用率,或者更高的质量 。
QUALITY 和 MEMORY
只有 AtMost 策略,选择 内存。其他策略 都是质量。
任重而道远
Android 手撕Glide--Glide缓存机制(面试)
在Glide4.0之前使用Glide只需要
但是在Glide4.0之后load(url)之后就不能调用.placeholder()等方法
查看4.0+的文档发现需要通过GlideApp来调用一系列方法
现在就可以使用GlideApp了
注意:需要添加网络权限!
在开发中,经常要做一些变化,比如剪裁指定形状,圆角(可以使用CircleImageView),这边推荐一个Glide的转换库
s://github/wasabeef/glide-transformations
实现圆角效果如下:
添加了占位图.placeholder(R.mipmap.ic_launcher)
如果ImageView设置了warp_content占位图会影响加载图的大小
所以,ImageView最好设置固定大小
glide优缺点
本文源码解析基于Glide 4.6.1
系列文章
Android 手撕Glide--Glide缓存机制
Android 手撕Glide--Glide缓存机制(面试)
Android 手撕Glide--Glide是如何关联生命周期的?
Glide缓存分为内存缓存和磁盘缓存,其中内存缓存是由弱引用+LruCache组成。
取的顺序是:弱引用、LruCache、磁盘
存的顺序是:磁盘、弱引用、LruCache
这张亲手制作的,方便大家更直观的理解缓存机制的整体流程,结合文末总结效果更佳。喜欢的记得点赞!
概述
1、弱引用是由这样一个HashMap维护,key是缓存的key,这个key由url、width、height等10来个参数组成;value是对象的弱引用形式。
2、LruCache是由一个LinkedHashMap维护,根据Lru算法来管理。大致的原理是利用linkHashMap链表的特性,把最近使用过的文件插入到列表头部,没使用的放在尾部;然后当大小到达预先设置的一个阀值的时候 ,按算法删除列表尾部的部分数据。由于篇幅有限,这里不讲解LruCache和DiskLruCache的底层原理,这里推荐一篇 图解LinkedHashMap原理
这是Glide自定义的LruCache
存取原理
取数据
在内存缓存中有一个概念叫引用计数器 ,具体来说是在 EngineResource 中定义一个 acquired 变量用来记录被引用的次数,调用 acquire() 方法会让变量加1,调用 release() 方法会让变量减1。
获取是先从弱引用取缓存,拿到的话,引用计数+1;没有的话从LruCache中拿缓存,拿到的话,引用计数也是+1,同时把从LruCache缓存转移到弱应用缓存池中;再没有的话就通过 EngineJob 开启线程池去加载,拿到的话,引用计数也是+1,会把放到弱引用。
存数据
很明显,这是加载之后的事情。通过 EngineJob 开启线程池去加载,取到数据之后,会回调到主线程,把存到弱引用。当不再使用的时候,比如说暂停请求或者加载完毕或者清除时,就会将其从弱引用中转移到 LruCache 缓存池中。 总结一下,就是正在使用中的使用 弱引用 来进行缓存,暂时不用的使用 LruCache 来进行缓存的功能;同一张只会出现在 弱引用 和 LruCache 中的一个。
为什么要引入软引用?
1、分压策略,减少Lrucache 中 trimToSize 的概率。如果正在remove的是张大图,lrucache正好处在临界点,此时remove操作,将延缓Lrucache的 trimToSize 操作;
2 提高效率:弱引用用的是 HashMap ,Lrucache用的是 LinkedHashMap ,从访问效率而言,肯定是 HashMap 更高。
Glide磁盘缓存策略(4.x)
如果在内存缓存中没获取到数据会通过 EngineJob 开启线程池去加载,这里有2个关键类: DecodeJob 和 EngineJob 。 EngineJob 内部维护了线程池,用来管理加载,当加载完毕的时候通知回调; DecodeJob 是线程池中的一个任务。
磁盘缓存是通过 DiskLruCache 来管理的,根据缓存策略,会有2种类型的, DATA (原始)和 RESOURCE (转换后的)。磁盘缓存依次通过 ResourcesCacheGenerator 、 SourceGenerator 、 DataCacheGenerator 来获取缓存数据。 ResourcesCacheGenerator 获取的是转换过的缓存数据; SourceGenerator 获取的是未经转换的原始的缓存数据; DataCacheGenerator 是通过网络获取数据再按照按照缓存策略的不同去缓存不同的到磁盘上。
Glide缓存分为 弱引用+ LruCache+ DiskLruCache ,其中读取数据的顺序是:弱引用 > LruCache > DiskLruCache>网络;写入缓存的顺序是:网络 --> DiskLruCache--> LruCache-->弱引用
内存缓存分为弱引用的和 LruCache ,其中正在使用的使用弱引用缓存,暂时不使用的用 LruCache缓存,这一点是通过 引用计数器(acquired变量)来实现的,详情可以看内存缓存的小结。
磁盘缓存就是通过DiskLruCache实现的,根据缓存策略的不同会获取到不同类型的缓存。它的逻辑是:先从转换后的缓存中取;没有的话再从原始的(没有转换过的)缓存中拿数据;再没有的话就从网络加载数据,获取到数据之后,再依次缓存到磁盘和弱引用。
参考:
面试官:简历上最好不要写Glide,不是问源码那么简单
原来面试的时候写精通Glide,这样问我这样答
优点
多样化媒体加载
Glide 不仅是一个缓存,它支持 Gif、WebP、缩略图。甚至是 Video
生命周期集成
通过设置绑定生命周期,我们可以更加高效的使用Glide提供的方式进行绑定,这样可以更好的让加载的请求的生命周期动态管理起来
高效的缓存策略
A. 支持Memory和Disk缓存
B. Picasso 只会缓存原始尺寸的,而 Glide 缓存的是多种规格,也就意味着 Glide 会根据你 ImageView 的大小来缓存相应大小的尺寸
比如你 ImageView 大小是200200,原图是 400400 ,而使用 Glide 就会缓存 200200 规格的图,而 Picasso 只会缓存 400400 规格的。这个改进就会导致 Glide 比 Picasso 加载的速度要快,毕竟少了每次裁剪重新渲染的过程,非常灵活 & 加载速度快
C. 内存开销小
默认的 Bitmap 格式是 RGB_565 格式,而 Picasso 默认的是 ARGB_8888 格式,这个内存开销要小一半。
Android关于内存计算,共有四种,分别是:
ALPHA_8:每个像素占用1byte内存
ARGB_4444:每个像素占用2byte内存
ARGB_8888:每个像素占用4byte内存(默认,色彩最细腻=显示质量最高=占用的内存也最大)
RGB_565:每个像素占用2byte内存(8bit = 1byte)
举例说明:一个32位的PNG=ARGB_8888=1204x,那么占用空间是:xx(32/8) = 4,194,304kb=4M左右
在解析的时候,为了避免oom和节省内存,最好使用ARGB_4444模式(节省一半的内存空间)
4.2 缺点
使用方法复杂
由于Glide其功能强大,所以使用的方法非常多,其源码也相对的复杂
包较大