说到图片加载框架,第一个想到的自然就是Glide,但是你真的了解它吗?如果面试问到相关问题你能顺利答出来吗?
Glide:
内容表现形式
(如Gif、WebP、缩略图、Video)生命周期管理
图片加载请求)复用和主动回收
,减少系统回收压力)加载速度快且内存开销小
(默认Bitmap格式的不同,使得内存开销是Picasso的一半)Fresco:
内存区域
(Ashmem区)OOM
(在更底层的Native层对OOM进行处理,图片将不再占用App的内存)高性能加载大量图片
的场景三级缓存:内存缓存,硬盘缓存,网络
LruCache
,采用最近最少使用算法,设定一个缓存大小,当缓存到达这个大小之后,会将最老的数据移除,保证内存的充足,从而避免oom。DiskLruCache
,思路差不多,也是没次往硬盘写文件,大小超过阀值,就将旧文件删除。网络
获取图片数据,并加载首次加载数据,通过网络获取图片对象,保存到内存和硬盘中,下次读取数据,会先从内存获取,没有的话就从本地硬盘加载,都没有的话就从网络获取资源。
Handler
class EngineJob<R> implements DecodeJob.Callback<R>,Poolable {
private static final EngineResourceFactory DEFAULT_FACTORY = new EngineResourceFactory();
//创建Handler
private static final Handler MAIN_THREAD_HANDLER =
new Handler(Looper.getMainLooper(), new MainThreadCallback());
LruCache
中缓存大小的设置 2)软引用,缓存中尽量存储软引用
,当内存不足时会自动被GC 3)bitmap像素数据存储,ndroid3.0到8.0之间Bitmap像素数据存在Java堆
,而8.0之后像素数据存到native堆
中onLowMemory
方法,可以在里面进行一些内存的释放销毁
的时候要记得取消图片加载任务,否则可能会导致内存泄漏复用机制
,可能会导致图片错乱,这时候就要根据图片的tag来判断图片加载地址是否正确。https://juejin.im/post/6844903986412126216