浅析Glide源码执行流程

本文深入剖析Glide源码,详细解读其执行流程。从with()方法开始,阐述了不同参数类型对生命周期的影响;load()方法中,解析了DrawableTypeRequest对象的生成及其提供的API;into()方法里,讲解了如何创建加载请求并调用begin方法开始图片加载过程。通过EngineRunnable的run方法,揭示了资源解码和图片展示的核心机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

浅析Glide源码执行流程

  • with()
    1,传入Application类型的参数,和传入非Application类型的参数。
    2,传入Application参数的情况,和应用程序的生命周期同步。
    3,非Application参数,会向当前的Activity当中添加一个隐藏的Fragment,以同步生命周期。
    4,在非主线程当中使用的Glide,那么不管你是传入的Activity还是Fragment,都会被强制当成Application来处理。
  • load()
    with()方法返回的是一个RequestManager对象,所以load()方法是在RequestManager类当中。
    1,主要的工作都是在loadGeneric(),最后返回DrawableTypeRequest对象,传入ModelLoader对象,还有一大堆杂七杂八的东西。
    2,DrawableTypeRequest内容最主要的就是它提供了asBitmap()和asGif()这两个方法。
    3,DrawableTypeRequest的父类是DrawableRequestBuilder,各种灵活的API在此。
    4,DrawableRequestBuilder类中有一个into()方法,也就是说,最终load()方法返回的其实就是一个DrawableTypeRequest对象。
  • into()
    1,DrawableRequestBuilder的父类是GenericRequestBuilder,into()逻辑在于此。
    2,ImageViewTargetFactory 的buildTarget()方法中会根据传入的class参数来构建不同的Target对象,这个class参数其实基本上只有两种情况,使用Glide加载图片的时候调用了asBitmap()方法,会构建出BitmapImageViewTarget对象,否则的话构建的都是GlideDrawableImageViewTarget对象。
    3,又将这个对象参数传入到了GenericRequestBuilder另一个接收Target对象的into()方法当中。
    4,在这个into()方法里面创建加载图片的request,obtainRequest()传入各种参数placeholderId、errorPlaceholder、diskCacheStrategy,load()方法中调用的所有API,都是在这里组装到Request对象当中。
    5,内部实现创建了一个 GenericRequest 然后调用 GenericRequest#begin 方法,
    6,begin 方法主要onSizeReady 负责获取图片,target.onLoadStarted(getPlaceholderDrawable()); //加载默认图
    7,onSizeReady方法,内部调用 Engine#load 方法,获取 EngineJob //内部拥有线程池, 用以执行EngineRunnable,EngineRunnable 在 EngineJob中执行
    8,核心内容就是 EngineRunnable 的 run 方法,resource = decode()获取要加载图片,通过Glide百货提供的工具来完成网络请求转码保存成bitmap 到 drawable 过程。
    9,onLoadComplete 处理展示图片,EngineJob#onResourceReady(依次向上回调到GenericRequest#onResourceReady中)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值