Glide原理及⾯试
Glide
With:当上下⽂对象传⼊的是⾮全局context,如果glide运⾏在⾮UI线程,使⽤全局上下⽂,如果glide在UI线程加载图⽚,因为activity的⽣命周期和UI线程并不完全同步,所以glide⽆法准确得知寄存体的⽣命周期, 因此glide底层创建出⼀个不可见fragment,⽽fragment的⽣命周期和activity同步,所以当activity ondestory的时候,停⽌glide图⽚加载。
如果是全局上下⽂,那么glide加载图⽚跟随application的⽣命周期。
缓存:glide⽀持默认内存缓存,当然根据实际需求可以关闭内存缓存。本地缓存需要⼿动设置,总共有四个缓存类型,all:缓存资源和处理结果;source:只缓存资源;result:只缓存处理结果图;none:不进⾏本地缓存;缓存采⽤lrucache算法,本地缓存⽀持的默认空间为250M,使⽤线程池处理本地缓存,线程池的核⼼数量等于获得可⽤的处理器个数。
Load:load⽅法根据传⼊类型不同,有多个重载,每个重载⽅法最后都会返回⼀个DrawableTypeRequest 对象,他的⽗类DrawableRequestBuilder是⼀个⽀持链式调⽤的类。
Into:into是所有⽅法中最为复杂的,⾥边传⼊要显⽰图⽚的view,将处理后的图⽚设置到view上,因为涉
及到UI的更新,所以底层会检查是否是主线程。传⼊的view在glide底层被封装成了⼀个target对象,target能够获取⾃⾝绑定的请求,当发现之前的请求还在的时候,会把旧的请求清除掉,绑定新的请求,这也就是为什么控件复⽤时不会出现图⽚错位的问题。设置图⽚之前,⾸先会从memorycache中读取,如果没有从磁盘读取,当然读取resource还是result是有磁盘缓存的策略决定的,获取到对应的图⽚后将图⽚设置给imageview。
特殊形状图⽚设置:glide3设置图⽚形状通过transform⽅法⾥边传⼊⾃定义view,glide4新增了apply⽅法直接设置常⽤形状。
关于glide加载图⽚可能引发oom问题的处理
1,⾃定义recyview,重写onViewRecycled⽅法,在⽅法内,将划出当前屏幕的item中,已经为空的imageview,调⽤glide的clear⽅法清除imageview中的资源。
1.怎么在项⽬中加载图⽚的?
⽤Glide⽐较多,Glide⾥的ImageLoader解决图⽚错乱,还有图⽚缓存,节约内存空间
2.Glide哪些好处?
可以播放gif图
图⽚有序位置有序排放
因为:图⽚标志缓存绑定,只展⽰绑定的图⽚地址,不是乱显⽰,防⽌图⽚位置错乱。
⽐其它图⽚框架优秀
缺点:会出问题,应该从0秒开始3秒结束,结果每次播放git图⽚都是从1秒或者2秒,或者0.8秒开始,播放太快,给⽤户体验效果差
3.Glide好处体现在哪?
其它图⽚不⽀持gif图⽚播放,只有Glide框架,因为它可以绑定⽣命周期
4.绑定⽣命周期好处?
⽐如在A,Activity加载图⽚,刚加载的时候⽤户就点返回,就把A,Activity关掉了,由于加载图⽚可能是异步任务,即使把A,Activity 关掉了,异步任务依然在执⾏,占⽤了⼀定的资源,⼀直会引⽤A,Activity的实例,导致A,Activity对象没办法释放,就会导致内存泄漏
5.Glide原理?
定义:Glide是⼀个快速⾼效的Android图⽚加载库,具备性能⾼,流式API(链式调⽤)的语法特点
优势:
可配置中度⾼,⾃适应度⾼
⽀持多种数据源,本地,⽹络,assetes gif在glide是⽀持的
⾼效缓存,⽀持memory和disk图⽚缓存,默认⼆级缓存
⽣命周期集成到Glide
对象图片高清⾼效处理Bitmap,使⽤Bitmap pool复⽤Bitmap
图⽚加载过程可以监听
采⽤了软引⽤
Glide⾥的链式调⽤返回的都是Bitmap⾥的⽅法
Glide⾥有线程专门处理请求的,从队列⾥获取请求,还会设置⼀个占位图⽚去后台获取数据图⽚,图⽚放到指定的ImageView⾥
队列:LinkedBlockingQueue(有序的先进先出后进后出的队列)(线程安全(避免多个线程执⾏同⼀个任务,产⽣错误结果))采⽤构造传参的this⽅式创建对象
线程:死循环⽅式去执⾏4件事(app设计,避免不了耗资源)
队列⾥获取请求,异步⽅法Handler
设置⼀个占位图⽚去后台获取数据图⽚,⽹络⾥请求把IO流转成Bitmap对象
图⽚放到指定的ImageView⾥(判断bitmap对象equals⾥的Url⼀致)放到主线程设置图⽚,进程结束,死循环结束
只有唯⼀的类可以⽤单例模式
线程池:int 变量=根据线程的需要

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。