美文网首页
Glide源码解析之初始化流程

Glide源码解析之初始化流程

作者: 苍龙阁阁主 | 来源:发表于2018-01-11 19:20 被阅读0次

    目前新项目中的图片加载框架已经换成了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又是如何做解码,圆角图片,缩放等处理的呢,且听下回分解

    相关文章

      网友评论

          本文标题:Glide源码解析之初始化流程

          本文链接:https://www.haomeiwen.com/subject/lrqanxtx.html