Glide 系列一:前言

168 阅读2分钟

Glide 系列一:序言

序言

  • Glide 是目前主流Android 开源框架之一,笔者在此前处理分析了RxJava,OKHttp,Retrofit ;Glide 将作为开源框架收官之作,接下来的精力就在秋招了,祝好!

本文概述

  • 本文为Glide 系列第一篇文章,基于Glide 4.11 ,介绍了系列文章思路,Glide 的使用场景,Glide 源码流程,Glide 加载图片时的源码流程。

基本说明:

导入依赖

  • 导入最新版本Glide 依赖:app/build.gradle

     dependencies {
         ……
         //导入最新版本Glide 依赖
         implementation'com.github.bumptech.glide:glide:4.11.0'
     }
    

系列文章思路

  • 关键代码

    Glide.with(this).load(URL).into(ImageView)
    
  • 整体分为三个阶段

    • with:空白Fragment 管理声明周期

    • load:构建出RequestBuilder 对象

    • into:

      • 第一:运行队列 与 等待队列

        • 发起多个Glide 请求,放到不同的队列中
      • 第二:活动缓存

      • 第三:内存缓存

      • 第四:网络模型

Glide 使用场景一:

  • MainActivity

    override fun onCreate(xxx){
        ……
        Glide.with(this).load(URL).into(ImageView)
    }
    
    override fun onDestroy(xxx){
        super.onDestroy()
        Glide.with(this).clear(imageView)
    }
    
  • 问:使用之后是否需要clear?

    • 不必须,Glide 内部存在监听机制,会去监听onDestroy() ,自动clear()

未使用Glide :手动设置生命周期(百度SDK 之前的做法)

  • MainActivity

    @Override
    protected void onStart(){
        super.onStart();
        xxx.startActionXXX();
    }
    @Override
    protected void onStop(){
        super.onStop();
        xxx.stopActionXXX();
    }
    @Override
    protected void onDestroy(){
        super.onDestroy();
        xxx.onRelease();
        xxx.recycle();
    }
    
  • 在Glide 中不需要这样干,全自动的;

Glide 源码流程 :作用域之分

  • 根据在主线程/子线程使用Glide ,分为两条流程;

    • 在主线程调用:作用域为宿主生命周期

      • 会在MainActivity(宿主) 上覆盖一个空白的Fragment ,其作用域为MainActivity(宿主),当MainActivity 发生onStart()、onStop()、onDestroy() 三种生命周期回调方法,紧接着就会触发空白Fragment 的相应的方法,接着会去触发RequestManager 中相关回调 ---> Glide 中的对应的类(执行逻辑 )
      • 细节:只有Glide 中三种回调onStart()、onStop()、onDestroy()
    • 在子线程调用:其作用域为Application

      • 不会创建空白Fragment ,其作用域为Application ,随应用的灭亡而灭亡
    • 作用域可看做Glide 的生命周期

Glide 是怎么处理图片加载请求:RequestManager

  • 基本说明:

    • 空白Fragment 相关生命周期方法,会去触发RequestManager;
    • RequestManager 进一步处理Glide 中的类(比如图片显示ImageViewTarget )
  • 业务场景:加载图片

    • 场景描述:当Activity 正在加载服务器的图片,但用户关掉了Activity ;

    • Glide 处理办法:RequestManager 中的onStop() ,停止掉ImageViewTarget

      • Activity.onStop() ---> 空白Fragment.onStop() ---> RequestManager.onStop() ---> 停止掉ImageViewTarget