Glide 是如何运作的,这篇3分钟看懂

Glide 是如何运作的,这篇3分钟看懂

流程

  1. with
    • 初始化glide,线程池(Engine)[默认使用GlideExecutor, 根据cpu计算线程数量,最小4个 ]
    • 监听生命周期和网络
  2. load 设置资源地址-资源的属性
  3. into 为target设置request, 加入线程池开始任务

如何回调

into方法
into(
        glideContext.buildImageViewTarget(view, transcodeClass),
        /*targetListener=*/ null,
        requestOptions,
        Executors.mainThreadExecutor());

关键地方在最后一个参数, 主线程执行

private static final Executor MAIN_THREAD_EXECUTOR =
  new Executor() {
    private final Handler handler = new Handler(Looper.getMainLooper());

    @Override
    public void execute(@NonNull Runnable command) {
      handler.post(command);
    }
  };

网络下载在哪里

DecodeJob

这个是一个Runnable的任务, 我们看看run方法, 主要是runWrapped()

private void runWrapped() {
  switch (runReason) {
    case INITIALIZE:
      //初始化
      stage = getNextStage(Stage.INITIALIZE);
      currentGenerator = getNextGenerator();
      runGenerators();
      break;
    case SWITCH_TO_SOURCE_SERVICE:
      //获取资源(网络/本地)
      runGenerators();
      break;
    case DECODE_DATA:
      //解析资源(bitmap/drawable等等)
      decodeFromRetrievedData();
      break;
    default:
      throw new IllegalStateException("Unrecognized run reason: " + runReason);
  }
}
generator

有以下这几种生成器

private DataFetcherGenerator getNextGenerator() {
    switch (stage) {
      case RESOURCE_CACHE:
        //已经修改过的缓存, 加载到view的
        //from cache files containing downsampled/transformed resource data.
        return new ResourceCacheGenerator(decodeHelper, this);
      case DATA_CACHE:
        //原图资源缓存
        //from cache files containing original unmodified source data.
        return new DataCacheGenerator(decodeHelper, this);
      case SOURCE:
        //源资源
        //from original source data using registered {@link com.bumptech.glide.load.model.ModelLoader ModelLoaders} and the model provided for the load.
        return new SourceGenerator(decodeHelper, this);
      case FINISHED:
        return null;
      default:
        throw new IllegalStateException("Unrecognized stage: " + stage);
    }
  }
网络请求处理
  • HttpUrlFetcher: HttpURLConnection
  • OkHttpStreamFetcher: OkHttp
解析网络数据

ResourceDecoder

有很多种解析器, 主要将网络数据decode成bitmap/drawable, 用于显示.

<think>我们正在处理关于Glide开源软件的问题。用户希望了解Glide在官网中定义的主要功能和作用。根据提供的引用,特别是引用[2]中详细描述了Glide的功能和优势,我们可以总结如下: Glide是一个流行的开源Android图片加载库,由Google推出。它的主要功能是快速、有效地加载各种大小和类型的图片,并提供了大量的配置选项和可扩展性。 主要作用包括: 1. 更快的图片加载速度:利用缓存技术,特别是在移动网络条件下表现优异。 2. 支持各种图片格式:包括GIF、WebP、JPEG、PNG等,并支持自动的图片格式转换。 3. 内存和资源效率优化:自动调整图片大小以减少内存使用,防止内存泄漏。 4. 灵活的API:通过丰富的API,开发者可以快速定制和扩展加载功能。 此外,引用[1]也提到Glide是一个强大且灵活的图片加载库,可以帮助开发者实现高效、流畅的图片加载,提升应用的用户体验。 因此,我们可以将Glide的主要功能和作用总结为:高效加载图片、支持多种格式、内存优化和提供灵活API。 注意:虽然引用[3]提到了Glide Data Grid,但根据上下文,它似乎是另一个不同的项目(用于数据表格),与用户询问的图片加载库Glide无关。引用[4]和[5]则与Glide无关,因此我们主要参考引用[1]和[2]。 根据以上信息,我们给出回答。</think>基于Glide官方文档和社区资料,Glide开源软件在官网定义的核心功能和作用如下: ### 主要功能 1. **高效图片加载** - 采用多层缓存机制(内存+磁盘),实现毫秒级图片加载,尤其优化了列表滚动时的图片加载性能[^2] - 支持智能图片尺寸适配,自动匹配`ImageView`尺寸减少内存占用[^2] 2. **多媒体格式支持** - 原生支持`JPEG/PNG/GIF/WebP`等主流格式 - 支持视频帧提取(如`MP4`文件缩略图生成)[^2] 3. **生命周期集成** - 自动绑定`Activity/Fragment`生命周期,避免内存泄漏 - 请求随界面销毁自动终止[^1] 4. **动态变换处理** - 提供圆形裁剪、灰度转换、模糊滤镜等实时图像处理 - 支持自定义变换扩展[^2] ### 核心作用 1. **性能优化** - 通过内存复用池减少GC次数,保证滚动流畅性 - 网络请求自动合并与优先级调度[^1] 2. **开发效率提升** - 链式调用API:单行代码完成图片加载(如`Glide.with(context).load(url).into(imageView)`) - 自动处理图片解码线程管理[^2] 3. **流量节省** - 支持`WebP`等高效图片格式 - 按需加载原始图/缩略图[^1] ```mermaid graph LR A[Glide核心功能] --> B[图片加载] A --> C[格式支持] A --> D[生命周期管理] A --> E[图像变换] B --> F[三级缓存机制] C --> G[静态图/GIF/视频帧] D --> H[自动请求管理] E --> I[内置滤镜+自定义] ``` > 示例代码:基础使用 > ```kotlin > // 加载网络图片并应用圆形裁剪 > Glide.with(fragment) > .load("https://example.com/image.jpg") > .circleCrop() > .into(imageView) > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值