Glide的使用及源码分析

这篇具有很好参考价值的文章主要介绍了Glide的使用及源码分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

依赖

implementation 'com.github.bumptech.glide:glide:4.16.0'

github: GitHub - bumptech/glide: An image loading and caching library for Android focused on smooth scrolling

基本使用

//加载url
Glide.with(this)
.load(url)
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.into(imageView)

//加载本地drawable资源
Glide.with(this)
.load(R.mipmap.ic_launcher)
.into(imageView)

//加载gif,Glide会智能判断
Glide.with(this)
.load(R.drawable.a)
.into(imageView)

//asBitmap只加载静态图片,如果图片为gif则加载第一帧
Glide.with(this)
.asBitmap()
.load(R.drawable.a)
.into(imageView)


//后备回调符
Glide.with(this)
.load(url)
.fallback(R.mipmap.ic_launcher) //当url为null时显示
.into(imageView)

 RequestOptions

Glide的配置都可以通过RequestOptions配置,用于提取公共属性,复用。

RequestOptions options = new RequestOptions()
        .placeholder(R.drawable.ic_launcher_background)
        .error(R.drawable.ic_launcher_foreground)
        .fallback(R.mipmap.ic_launcher);

Glide.with(this).load(URL).apply(options).into(view);

设置图片大小

宽高单位是px

Glide.with(this).load(URL).override(100,100).into(view);

设置缩略图

RequestBuilder<Drawable> requestBuilder= Glide.with(this)
      .asDrawable().sizeMultiplier(0.5f);//显示原图的50%
Glide.with(this).load(URL).thumbnail(requestBuilder).into(view);

先加载缩略图,再加载原图

//先加载缩略图,再加载原图
RequestBuilder<Drawable> requestBuilder1= Glide.with(this).load(URL1);

Glide.with(this).load(URL).diskCacheStrategy(DiskCacheStrategy.NONE)
      .thumbnail(requestBuilder1).into(view);

缓存设置

Glide默认开启内存缓存和硬盘缓存

禁用缓存策略

Glide.with(this).load(URL).skipMemoryCache(true).into(view);

硬盘缓存策略

  • DiskCacheStrategy.NONE //不开启硬盘缓存
  • DiskCacheStrategy.DATA //只缓存原始图片
  • DiskCacheStrategy.RESOURCE //只缓存转换后的图片
  • DiskCacheStrategy.ALL //同时缓存原始图片和转换后图片
  • DiskCacheStrategy.AUTOMATIC //智能模式,Glide根据图片资源选择模式
  Glide.with(this).load(URL).diskCacheStrategy(DiskCacheStrategy.NONE).into(view);

预加载

  Glide.with(this).load(URL).preload();

文件下载

        new Thread(() -> {
            FutureTarget<File> target =  Glide.with(MainActivity.this).asFile().load(URL).submit();
            try {
                File image =  target.get();
                File file = new File(getCacheDir(),"file.png");
                image.compareTo(file);
            } catch (ExecutionException | InterruptedException e) {
                throw new RuntimeException(e);
            }
        }).start();

图片裁剪

Glide.with(this)
.load(url)
//.centerCrop() //居中剪裁
//.fitCenter() // 默认
.circleCrop() //圆形图片
.into(imageView)

过渡动画

 //过渡动画
Glide.with(this)
      .load(URL)
      .diskCacheStrategy(DiskCacheStrategy.NONE)
      .transition(withCrossFade(1000)) //默认为300ms
      .into(view);

可以自定义动画

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromAlpha="0"
    android:toAlpha="1" />
Glide.with(this).load(URL).diskCacheStrategy(DiskCacheStrategy.NONE).
    transition(GenericTransitionOptions.with(R.anim.anim_alpha)).
    into(view)

源码分析

with
 RequestManager requestManager = Glide.with(this);

Glide的使用及源码分析,Android基础,glide

load
RequestBuilder<Drawable> load = requestManager.load(URL);

Glide的使用及源码分析,Android基础,glide

into

        CustomViewTarget<ImageView, Drawable> target = new CustomViewTarget<ImageView, Drawable>(view) {
            @Override
            protected void onResourceCleared(@Nullable Drawable placeholder) {
                Log.e(TAG, "资源清理");
            }

            @Override
            public void onLoadFailed(@Nullable Drawable errorDrawable) {
                Log.e(TAG, "加载失败");
            }

            @Override
            public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
                Log.e(TAG, "加载成功");
            }
        };

        CustomViewTarget<ImageView, Drawable> into = load.into(target);

1:RequestBuilder.java

->into

->return into( glideContext.buildImageViewTarget(view, transcodeClass), /* targetListener= */ null, requestOptions, Executors.mainThreadExecutor()); //构造一个ImageViewTarget

->Request request = buildRequest(target, targetListener, options, callbackExecutor); //构造一个请求,接口实现SingleRequest

2:RequestManager.java

->requestManager.track(target, request);

3:RequestTracker.java

->requestTracker.runRequest(request);//两个set集合添加request请求

->request.begin();

4:SingleRequest.java

 ->onSizeReady(overrideWidth, overrideHeight);

5:Engine.java

->memoryResource = loadFromMemory(key, isMemoryCacheable, startTime);//三级缓存

->EngineResource<?> active = loadFromActiveResources(key); //一级缓存活动--运行时缓存

->EngineResource<?> cached = loadFromCache(key); //二级缓存Cache--运行时缓存

->waitForExistingOrStartNewJob

->jobs.get(key, onlyRetrieveFromCache)////三级缓存磁盘-非运行时缓存

6:EngineJob.java

如果缓存里都没有,去请求

->engineJob.start(decodeJob);

7:DecodeJob.java

->run()

->runWrapped()

->case INITIALIZE:

stage = getNextStage(Stage.INITIALIZE);

currentGenerator = getNextGenerator();

runGenerators();

->currentGenerator.startNext()

Glide的使用及源码分析,Android基础,glide

8:SourceGenerator.java

->startNext()

9:DecodeHelper.java

->loadData = helper.getLoadData().get(loadDataListIndex++);

-> glideContext.getRegistry().getModelLoaders(model)  //这里会取注册的Loaders

10:ModelLoader.java

->LoadData<?> current = modelLoader.buildLoadData(model, width, height, options);

Glide的使用及源码分析,Android基础,glide

11:HttpGlideUrlLoader.java

->buildLoadData

->return new LoadData<>(url, new HttpUrlFetcher(url, timeout));

12:HttpUrlFetcher.java

->loadData

->loadDataWithRedirects(glideUrl.toURL(), 0, null, glideUrl.getHeaders()); //发起HttpUrlConnect请求

Glide的使用及源码分析,Android基础,glide

->getStreamForSuccessfulRequest;//获得InputStream

->stream = ContentLengthInputStream.obtain(urlConnection.getInputStream(), contentLength);//会对InputSteam做一系列的优化,压缩,防止过大导致崩溃

……

->InputStream会转成Bitmap

……

最终回调到CustomViewTarget.onResourceReady

也就是Glide的使用及源码分析,Android基础,glide

贴上完整的时序图

Glide的使用及源码分析,Android基础,glide

Glide生命周期

Glide之所以如此灵活,无须对用户的Activity或Fragment进行管理,避免内存泄漏,在于空白的父类SupportRequestManagerFragment,通过jetpack的lifecycle进行管理。

Glide的使用及源码分析,Android基础,glide

面试总结

1:在子线程使用Glide.with函数,会发生什么?

Glide的使用及源码分析,Android基础,glide

答:Glide.with在子线程里不会添加生命周期,在主线程才会添加一个FragmentActivity,绑定使用的Activity生命周期

2:项目中大量使用Glide,会造成内存泄漏问题,请问如何避免?

答:通过Glide.with()传入的对象,尽量是包含能自动回收的Activity等包含生命周期的作用域,避免使用Application这种,造成无法回收现象。

3:使用Glide为什么要加入网络权限?

<uses-permission android:name="android.permission.INTERNET" />

答:因为内部会有HttpURLConnection请求,在执行Request事务后,会先从活动缓存取,如果没有,再去内存缓存,再去磁盘缓存,然后通过HttpUrlFetcher发起HttpURLConnection请求,所有需要网络权限

4:Glide源码里面的缓存,为什么要有 活动缓存 还需要 有内存缓存?或者为什么设计三层缓存?

答:简单来说,一级缓存采用LRU算法,最新最少使用的图片,当请求队列有新的图片时候,会淘汰掉最新最少使用的图片,如果这张图片后面还需要页面展示,那么就会有产生效率问题,因此再增加了一层不采用LRU的内存缓存。文章来源地址https://www.toymoban.com/news/detail-703075.html

到了这里,关于Glide的使用及源码分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android使用Glide类加载服务器中的图片

    Glide类用于从服务器中获取图片并加载进ImageView。 一、添加依赖 Glide为 第三方框架 ,使用时需添加依赖: 在 Gradle Scripts / build.gradle(Module:app) / dependencies方法 中添加 添加后会下载。 二、获取权限 获取服务器中的图片需要 申请(静态声明)网络权限 ,在清单文件中添加 三、

    2024年02月06日
    浏览(43)
  • Android Glide判断图像资源是否缓存onlyRetrieveFromCache,使用缓存数据,Kotlin

    本文详细介绍了如何在Android开发中使用Glide库和Kotlin语言处理图像缓存。包括判断图像资源是否已缓存,以及如何只从缓存中加载图像。

    2024年02月08日
    浏览(69)
  • Android Glide

    1.引入glide 2.AndroidManifest.xml 中添加需要的权限 如果你计划从 URL 或一个网络连接中加载数据,你需要加 INTERNET 和 ACCESS_NETWORK_STATE 权限到你的 AndroidManifest.xml 中,要从本地文件夹或DCIM或图库中加载图片,你将需要添加 READ_EXTERNAL_STORAGE 权限。 3. 基本使用 Glide.with([fragment/Conte

    2024年04月12日
    浏览(36)
  • [Android]图片加载库Glide

    目录 Glide的介绍  Glide的基本使用   指定图片的格式 Glide占位符  指定图片的大小  过渡动画 图片变换 Generated API Glide的介绍 Glide是一个快速高效的Android图片加载库,可以自动加载网络,本地文件,app资源中的文件,注重于平滑的滚动。 开源地址:https://github.com/bumptech/gl

    2024年02月08日
    浏览(43)
  • Glide源码解析三(注册组件)

    转载请标明出处,维权必究: https://www.cnblogs.com/tangZH/p/12900387.html Glide源码解析一,初始化 Glide源码解析二—into方法 Glide源码解析三(注册组件) Glide源码解析四(解码和转码) Glide自定义组件注册 通过Glide加载不可见的图片   本文基于Glide 4.11.0   这里说的注册便是Glide初

    2024年02月12日
    浏览(28)
  • Glide原理分析

    工程目录图 Glide源码分析 - 缓存源码分析 活动缓存 :当前activity有效 内存缓存(LRU算法,核心linkhashmap),当前运行的整个app生命周都有效,有大小限制,防止app oom 磁盘缓存,整个app都有效,只要app没有卸载掉 虽然有三级缓存,一般只用二级缓存防止oom Glide 4.0之后用引擎加

    2024年02月15日
    浏览(31)
  • Android Glide CustomTarget ,kotlin

    Android Glide CustomTarget ,kotlin       android Glide CustomViewTarget,java_zhangphil的博客-CSDN博客 【代码】android Glide CustomViewTarget,java。 https://blog.csdn.net/zhangphil/article/details/129493334 Android Glide预加载preload ,kotlin_zhangphil的博客-CSDN博客 【代码】Android Paging 3,kotlin(1)在实际的开发中,虽然G

    2024年02月16日
    浏览(44)
  • Android 加载gif图,Glide

    个人中心 DownLoad Android 可以使用 Glide、Picasso、Fresco 等第三方库来加载 gif 图。 以 Glide 为例,可以按照以下步骤加载 gif 图: 1. 在 build.gradle 文件中添加 Glide 的依赖: ``` dependencies {     implementation \\\'com.github.bumptech.glide:glide:4.12.0\\\'     annotationProcessor \\\'com.github.bumptech.glide:compil

    2024年02月14日
    浏览(41)
  • Android Glide自定义AppGlideModule,让Glide在app启动后基于定制化GlideModule加载,kotlin

    Android Glide自定义AppGlideModule,让Glide在app启动后基于定制化GlideModule加载,kotlin   project的build.gradle:     app的build.gradle:       注解定义GlideModule   重新build项目。此后在项目代码中使用:GlideApp.  替代  Glide.  加载load图即可,自定义module就会触发使用。           Android图

    2024年02月13日
    浏览(44)
  • Glide源码解析四(解码和转码)

    本文基于Glide 4.11.0 Glide加载过程有一个解码过程,比如将url加载为inputStream后,要将inputStream解码为Bitmap。   从Glide源码解析一我们大致知道了Glide加载的过程,所以我们可以直接从这里看起,在这个过程中我们以从文件中加载bitmap为例: DecodeJob的一个方法: 主要是这个方法

    2024年03月09日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包