1、Glide简介:
Glide 是 Google 员工的开源项目, Google I/O 上被推荐使用,一个高效、开源、Android设备上的媒体管理框架,它遵循BSD、MIT以及Apache 2.0协议发布。Glide具有获取、解码和展示视频剧照、图片、动画等功能,它还有灵活的API,这些API使开发者能够将Glide应用在几乎任何网络协议栈里。创建Glide的主要目的有两个,一个是实现平滑的图片列表滚动效果,另一个是支持远程图片的获取、大小调整和展示。
gitHub地址:https://github.com/bumptech/glide
Glide调用时序图PDF版 :链接:http://pan.baidu.com/s/1b3nQIa 密码:ohy2
2、Glide特点
使用简单
可配置度高,自适应程度高
支持常见图片格式 Jpg png gif webp
支持多种数据源 网络、本地、资源、Assets 等
高效缓存策略 支持Memory和Disk图片缓存 默认Bitmap格式采用RGB_565内存使用至少减少一半
生命周期集成 根据Activity/Fragment生命周期自动管理请求
高效处理Bitmap 使用Bitmap Pool使Bitmap复用,主动调用recycle回收需要回收的Bitmap,减小系统回收压力
3、相关调用方法
Glide.with 方法解析
-
将当前显示的页面对象传入Glide
RequestManager主要作用为实现request和Activity生命周期相关联
with()方法的重载种类非常多,既可以传入Activity,也可以传入Fragment或者是Context。每一个with()方法重载的代码都非常简单,都是先调用RequestManagerRetriever的静态get()方法得到一个RequestManagerRetriever对象,这个静态get()方法就是一个单例实现,没什么需要解释的。然后再调用RequestManagerRetriever的实例get()方法,去获取RequestManager对象。
get 方法获取RequestManager
- 根据 Looper.myLooper == Looper.getMainLooper();判断是否在后台线程中
- 通过supportFragmentGet方法获取RequestManager
-
如果RequestManager为空。需要重新创建,并绑定Activity或者Fragment.
-
SupportRequestManagerFragment
-
监听当前页面的生命周期
-
-
生命周期的监听,从而处理RequestManager
-
ActivityFragmentLifecycle
- 观察者模式,fragment的生命周期交给了他
- RequestManager的实现
Load方法分析
- 判断当前的ImageView是否存在了请求,如果存在 将请求取消,并且回收资源 .
into方法
Glide流程
-
Glide.with(context)创建RequestManager
- RequestManager负责管理当前context的所有Request
- Context可以传Fragment、Activity或者其他Context,当传Fragment、Activity时,当前页面对应的Activity的生命周期可以被RequestManager监控到,从而可以控制Request的pause、resume、clear。这其中采用的监控方法就是在当前activity中添加一个没有view的fragment,这样在activity发生onStart onStop onDestroy的时候,会触发此fragment的onStart onStop onDestroy。
- RequestManager用来跟踪众多当前页面的Request的是RequestTracker类,用弱引用来保存运行中的Request,用强引用来保存暂停需要恢复的Request。
-
Glide.with(context).load(url)创建需要的Request
- 通常是DrawableTypeRequest,后面可以添加transform、fitCenter、animate、placeholder、error、override、skipMemoryCache、signature等等
- 如果需要进行Resource的转化比如转化为Byte数组等需要,可以加asBitmap来更改为BitmapTypeRequest
- Request是Glide加载图片的执行单位
Glide.with(context).load(url).into(imageview)
在Request的into方法中会调用Request的begin方法开始执行
在正式生成EngineJob放入Engine中执行之前,如果并没有事先调用override(width, height)来指定所需要宽高,Glide则会尝试去获取imageview的宽和高,如果当前imageview并没有初始化完毕取不到高宽,Glide会通过view的ViewTreeObserver来等View初始化完毕之后再获取宽高再进行下一步-
Glide加载资源:
- GlideBuilder在初始化Glide时,会生成一个执行机Engine
- Engine中包含LruCache缓存及一个当前正在使用的active资源Cache(弱引用)
activeCache辅助LruCache,当Resource从LruCache中取出使用时,会从LruCache中remove并进入acticeCache当中 - Cache优先级LruCache>activeCache
- Engine在初始化时要传入两个ExecutorService,即会有两个线程池,一个用来从DiskCache获取resource,另一个用来从Source中获取(通常是下载)
线程的封装单位是EngineJob,有两个顺序状态,先是CacheState,在此状态先进入DiskCacheService中执行获取,如果没找到则进入SourceState,进到SourceService中执行下载
-
Glide的Target:
- 负责图片加载的回调