Glide源码解析之初始化流程

目前新项目中的图片加载框架已经换成了glide,既然使用了glide,那么对于glide的加载流程,网络请求,图片缓存,图片加载等需要有一定的理解,这样遇见各种需求去修改,而从glide的源码中我们也能学习到很多东西,这样即使不换图片框架,也可以去替换部分内容,文中有什么错误之处,欢迎指正。

glide加载一张图片的基本流程如下:

Glide.with(context)

        .load("url")//图片地址

        .placeholder(R.mipmap.icon_loading)//加载图

        .error(R.mipmap.icon_error)//错误图

        .into(imageView);//加载目标view

我们先看with的时候执行了什么:


glide with 流程图

glide.with()创建一个RequestManagerRetriever的单例,如果在主线程,就会根据当前的activity或者fragment创建SupportRequestMangerFragment,并在这个fragment创建后创建一个RequestManger,不在主线程,则直接创建一个RequestManager的实例,这个RequestManager干什么的呢?我们看一下它的构造函数


RequestManager 构造函数

在RequestManager的构造函数中,我们发现它调用glide.get()实例化了glide,创建了用于监听网络状态的ConnectivityMonitorFactory并且RequestManager继承了LifecycleListener,其实RequestManager就是用于管理glide生命周期等内容的管理器

glide的生命周期是和activity相同的,这个是怎么做的呢,我们看流程图里,创建RequestManager的时候,先创建了一个fragment,并把这个fragment加入到了activity中,而fragment中,实例化的时候初始化了一个ActivityFragmentLifecycle的类,集成了lifecycle接口


lifecycle接口

而我们知道RequestManager实现了LifecycleListener接口,fragment生命周期中,会调用ActivityFragmentLifecycleListener的方法,回调到RequestManager对应的onStart,onStop及onDestroy方法,从而让glide的生命周期依赖于activity去自动开始销毁


glide 生命周期简单类关系图

到这里,RequestManger和Glide都创建出来了,但是Glide的实例是如何创建的呢?创建的时候又初始化了哪些东西呢?

我们看glide的get()方法


glide 实例化

在这里,我们看到,先根据AndroidManifest解析出来了GlideModule的list,然后根据glidemodule去配置glide,然后使用构建模式创建了glide的实例,然后后调用了module的register方法,那这个glidemodule是干什么的呢?


glidemodule

其实glidemodule的作用是为了让我们自己去修改glide 的配置,applyOptions会在glide实例化之前调用,register会在实例化后调用,如果我们想修改glide加载图片的清晰度或者缓存方式,可以在applyOptions中去修改,如果我们需要改变glide加载url的方式,比如给url添加头文件等信息,可以在register中去修改,如何判断在哪个里面修改内容呢?我们可以看glide实例化的方式,glide是使用glidebuilder构建出来的


glidebuilder

在glidebuilde中,从上往下构造了glide的引擎,bitmpa池,内存缓存,加载资源和读取资源的线程池,图片格式(PREFER_RGB_565或者PREFER_ARGB_8888),缓存方式,所以,修改这些可以在applyOption中去修改,而在glide的构造函数中,register的其他信息(例如加载图片的方式),则组要在glidemodule的register方法后去修改

在glide 的构造函数中,实例化了图片及gif的解析器


相关解析器等内容

以及加载不同路径的处理


不同load地址类型 loader注册

及获取到bitmap的处理(例如充满imageview)

bitmap处理

在glide.with后会生成RequestManager,而在requestManager 的 load()中,会调用loadGeneric(class<T>)根据参数的不同类型,调用不同的Loader去处理


根据T不同类型,调用不同的loader

例如我们的url为String,则会调用StreamStringLoader来生成相应的请求类去请求图片,并展现到into()中的imageview中,那glide是如何去请求图片的呢,请求下来的图片或gif又是如何做解码,圆角图片,缩放等处理的呢,且听下回分解

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270