Glide理解(1)

204 阅读2分钟

Glide是一个图片加载框架,功能强大,设计巧妙,调用优雅简单,如Glide.with(context).load(url).into(imageview)就可以完成图片请求加载过程。

with(context): 该方法会传入一个context并返回一个requestmanager对象,该对象是存在生命周期的。 1.如果在子线程调用那么会创建一个单例的requestmanager,其生命周期为APP的生命周期;2.如果传入application的context,那么requestmanager的生命周期就是APP的生命周期;3.如果传入的是activity/fragment/view的context,那么requestmanager的生命周期为他们附着的activity的生命周期。

假设该context为activity,则会根据tag查找是否有存在的空fragment,如果存在就获取该fragment的成员变量requestmanager,并返回;如果根据tag查找不到requestmanager,那么会创建一个空fragment,并创建一个requestmanager再返回。

因此我们可以得出:1.一个activity对应一个空的fragment,一个空fragment对应一个requestmanager;2.如果一个activity有多个图片请求,那么也只会有一个空fragment,一个requestmanager;3.该空fragment关联到activity,监听activity的生命周期,当activity生命周期变化时,感知到并通知requestmanager,由requestmanager做出相应的处理;4.我们传入的context尽量使用细粒度的,可以避免内存泄露。

如打开一个activity,启动glide加载图片,在加载过程activity被销毁,如果我们传入的context是application的context那么图片请求将继续,起不到监听生命周期的作用,而如果我们传入的是activity的context,那么随着activity的销毁,附着它上面的空fragment将感知到,并通知requestmanager,取消请求,避免资源浪费和内存泄露。

load(url): 该方法由requestmanager调用,传入一个图片链接(可以为其他),返回一个requestbuilder对象。主要将url存储到requestbuilder中的成员变量model中,进行简单的赋值。

into(imageview): 该方法由requestbuilder调用,传入参数imageview。 1.将imageview封装为target,并创建一个请求request,如果该target之前有请求previous,那么调用requestmanager.clear()清空,并重新为target.setrequest(request),并调用requestManager.track(target, request)启动异步请求。 2.判断页面是否处于paused状态,如果处于,则调用request.clear(),且将request投入等待执行的队列。,如果页面不处于onpaused,那么调用request.begin()。