type
status
date
slug
summary
tags
category
icon
password
这个问题是字节跳动面试官问的,当时没看过图片异步加载框架的原理,只能跟他说会用。今天仔细看了看原理感觉也没那么难。
Gilde的使用方法也很简单:
with绑定生命周期,load指定加载资源,into指明加载目标
生命周期绑定
源码解读
Glide.class和RequestManagerRetriever.class,主要用来获得RequestManager
RequestManagerFragment.class中持有一个lifecycle,在Fragment进入关键生命周期时会主动通知lifecycle执行相关方法
ActivityFragmentLifecycle.class中持有一个lifecycleListeners,在Fragment进入关键生命周期时Lifecycle会通知他的所有Listener
RequestManger.class关键生命周期中处理加载任务
总结
- Glide在加载绑定了Activity的生命周期。
- 在Activity内新建一个无UI的Fragment,这个特殊的Fragment持有一个Lifecycle。通过Lifecycle在Fragment关键生命周期通知RequestManger进行相关的操作。
- 在生命周期onStart时继续加载,onStop时暂停加载,onDestory是停止加载任务和清除操作。
缓存机制
缓存方式
- DiskCacheStrategy.NONE 不缓存文件
- DiskCacheStrategy.SOURCE 只缓存原图
- DiskCacheStrategy.RESULT 只缓存最终加载的图(默认的缓存略)
- DiskCacheStrategy.ALL 同时缓存原图和结果图
缓存键
缓存一般通过键值对的形式,缓存的键包括图片的宽、高、signature等参数。
图片加载策略

- 首先从ActivateResource获取,是个值为弱引用的Map
- MemoryCache和DiskCache是LruCache
MemoryCache和ActiveResource的关系

图片加载时会从MemoryCache移到ActivateResouce,生命周期结束后会缓存至MemoryCache,所以内存中至多有一份缓存。
主要线程池
上一篇
Android面试题:大图加载,防止OOM
下一篇
面试题:实现一个容器,提供两个方法,add,size;写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束
- 作者:比尔盖子
- 链接:https://www.connorshen.site/article/3d1b89a9-ab58-45d6-bc8d-a2c49a28e8dc
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。