Glide知识简介

article/2025/10/12 10:49:27

     首先Glide是Google为我们推荐的一个快速高效的图片加载库,使用简单。

第一步:添加依赖:

//glide的依赖 
implementation 'com.github.bumptech.glide:glide:4.9.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'

简单使用:一行代码即可搞定:
 

//一行代码搞定的方法
Glide.with(上下文).load(url地址).into(imageView);

复杂使用:需要设置placeholder图片显示类型:

1.老版本(glide版本4.6.0之前):

//老版本写法:
Glide.with(this).load(url).placeholder(R.mipmap.myuser_nologin).dontAnimate().error(R.mipmap.myuser_nologin).centerCrop().into(imageView);

2.新版本(glide版本4.6.0之后):

//新版Glide(4.6.0 之后)  需要设置optionsRequestOptions options = new RequestOptions().centerCrop().placeholder(R.drawable.booth_map).error(R.drawable.error).priority(Priority.HIGH).diskCacheStrategy(DiskCacheStrategy.NONE);Glide.with(mContext).load(listBean.getImage0()) .apply(options).into(viewHolder.ivPictureText);

Glide原理(源码解读):

在Glide的with方法里返回了RequestManager对象:

 而不管哪个调用哪个with方法,都会进入到get方法中,就是以下方法:

 而get方法中返回有一个方法fragmentGet:

/** @deprecated */@Deprecated@NonNullprivate RequestManager fragmentGet(@NonNull Context context, @NonNull FragmentManager fm, @Nullable android.app.Fragment parentHint, boolean isParentVisible) {RequestManagerFragment current = this.getRequestManagerFragment(fm, parentHint, isParentVisible);RequestManager requestManager = current.getRequestManager();if (requestManager == null) {Glide glide = Glide.get(context);requestManager = this.factory.build(glide, current.getGlideLifecycle(), current.getRequestManagerTreeNode(), context);current.setRequestManager(requestManager);}return requestManager;}

这里新建了一个视图的RequestManagerFragment:

RequestManagerFragment.class中持有一个lifecycle,在Fragment进入关键生命周期时会主动通知lifecycle执行相关方法

public class RequestManagerFragment extends Fragment {.......private final ActivityFragmentLifecycle lifecycle;......@Overridepublic void onStart() {super.onStart();lifecycle.onStart();}@Overridepublic void onStop() {super.onStop();lifecycle.onStop();}@Overridepublic void onDestroy() {super.onDestroy();lifecycle.onDestroy();unregisterFragmentWithRoot();}.........}

ActivityFragmentLifecycle.class中持有一个lifecycleListeners,在Fragment进入关键生命周期时Lifecycle会通知他的所有Listener:

class ActivityFragmentLifecycle implements Lifecycle {
.............private final Set<LifecycleListener> lifecycleListeners =Collections.newSetFromMap(new WeakHashMap<LifecycleListener, Boolean>());
.............
void onStart() {isStarted = true;for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {lifecycleListener.onStart();}}void onStop() {isStarted = false;for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {lifecycleListener.onStop();}}void onDestroy() {isDestroyed = true;for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {lifecycleListener.onDestroy();}}
}

RequestManger.class关键生命周期中处理加载任务:

/*** Lifecycle callback that registers for connectivity events (if the* android.permission.ACCESS_NETWORK_STATE permission is present) and restarts failed or paused* requests.*/@Overridepublic synchronized void onStart() {resumeRequests();targetTracker.onStart();}/*** Lifecycle callback that unregisters for connectivity events (if the* android.permission.ACCESS_NETWORK_STATE permission is present) and pauses in progress loads.*/@Overridepublic synchronized void onStop() {pauseRequests();targetTracker.onStop();}/*** Lifecycle callback that cancels all in progress requests and clears and recycles resources for* all completed requests.*/@Overridepublic synchronized void onDestroy() {targetTracker.onDestroy();for (Target<?> target : targetTracker.getAll()) {clear(target);}targetTracker.clear();requestTracker.clearRequests();lifecycle.removeListener(this);lifecycle.removeListener(connectivityMonitor);mainHandler.removeCallbacks(addSelfToLifecycle);glide.unregisterRequestManager(this);}

 总结:

  • 首先在Glide加载绑定了Activity的生命周期,比如with(context)方法
  • 然后在Activity内新建一个无UI的fragment,这个特殊的fragment持有一个Lifecycle。通过Lifecycle在Fragment关键生命周期通知RequestManager进行相关操作。
  • 最后在生命周期onStart时继续加载,在onStop时暂停加载,在onDestory时停止加载任务和清除操作

缓存机制:

  1. DiskCacheStrategy.NONE 不缓存文件
  2. DiskCacheStrategy.SOURCE 只缓存原图
  3. DiskCacheStrategy.RESULT 只缓存最终加载的图(默认的缓存略)
  4. DiskCacheStrategy.ALL 同时缓存原图和结果图

图片加载流程:

 

  1. 首先从ActivateResource获取,是个值为弱引用的Map
  2. MemoryCache和DiskCache是LruCache


http://chatgpt.dhexx.cn/article/mEqQWbNL.shtml

相关文章

OpenGL API - glDeleteShader

文章目录 名称原型参数描述错误 https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDeleteShader.xhtml OpenGL API - 笔记汇总 名称 glDeleteShader ---- 删除一个 shader 对象 原型 void glDeleteShader(GLuint shader);参数 shader 指定需要删除的 shader…

Android中的Glide

引入glide <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"androi…

android Glide介绍

目录 1.Glide的基本使用 1. 介绍 2. Glide占位符 2.Glide的进阶使用 1. 过渡动画 2. 变化 transform&#xff08;&#xff09; 3. Generated API 4. GlideExtension与GlideOption 1.Glide的基本使用 1. 介绍 Glide是一个快速高效的Android图片加载库&#xff0c;可以自…

Glide(二)Glide的with,load,into

Glide的with&#xff0c;load&#xff0c;into 在Glide的常规使用中&#xff0c;我们是这样使用的&#xff1a; protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ImageView imageView fin…

Glide学习

Glide框架学习 介绍with&#xff08;生命周期&#xff09;into缓存LRU缓存三级缓存为什么要有两种内存缓存加载顺序活动缓存为什么使用弱引用 介绍 常规方式&#xff1a;Glide.with(this).load(URL).into(imageView) 虽然with方法重载了很多个&#xff0c;我们可以传入不同的对…

Glide讲解

目录 Glide简介Glide的优点Glide的生命周期Glide如何实现图片缓存的内存缓存实现原理磁盘缓存实现原理引入缓存的目的Glide缓存流程从内存缓存读取总结从磁盘缓存读取总结写入磁盘缓存写入内存缓存汇总 Glide源码总结图解with&#xff08;&#xff09;load&#xff08;&#xf…

Glide详解

现在Android上的图片加载框架非常成熟&#xff0c;从最早的老牌图片加载框架UniversalImageLoader&#xff0c;到后来Google推出的Volley&#xff0c;再到后来的新兴军Glide和Picasso&#xff0c;当然还有Facebook的Fresco。每一个都非常稳定&#xff0c;功能也都十分强大。但是…

Android Glide

1.Glide Glide是Google主导的图片加载开源库。它有很多优势&#xff1a; ①使用简单&#xff0c;链式调用。 ②支持多种图片格式&#xff0c;如Gif、WebP、缩略图、Video等。 ③支持生命周期集成。Glide可以感知调用页面的生命周期&#xff0c;根据Activity或Fragment的生命…

[软件更新]gladder2.0.3.3

介绍 gladder是一个Firefox插件&#xff0c;名字被解释为Great Ladder (Ladder for Great Firewall)&#xff0c;目标是帮助人们跨过Great Firewall访问境外被查封的网站。 安装 https://addons.mozilla.org/en-US/firefox/addon/2864 (点击页面中的Install Now按钮) 功能 * 自…

飞机游戏代码(JAVA)

&#xff2d;yGameFrame类: 主要的调用类 package sc.wh.game;import javax.swing.JFrame; import java.awt.Color; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import sc.wh.game.*; import java.awt.event.KeyAdapte…

基于java的拼图经典游戏(附代码)

拼图游戏是一款经典的益智游戏&#xff0c;游戏开始前图片被随机打乱&#xff0c;空块位于最右下角&#xff0c;玩家通过点击空块周围图片或者按键方式对图片和空块进行相互交换&#xff0c;直到所有图片都回到原位即为游戏胜利。 本次制作的拼图游戏运行界面如下&#xff1a;…

java推箱子游戏源代码_java实现推箱子小游戏(附源码)

先上效果图 可以通过AWSD进行移动和推箱子 自己弄出来的代码玩起来还是很有意思的。 代码一共是三个.java文件,代码内容如下所示 package ss; import java.awt.Graphics; import java.awt.Image; import java.awt.Point; import java.awt.event.KeyEvent; import java.awt.eve…

免费Java游戏源代码素材推荐

家人们&#xff0c;最近我找到了一个很好用的Java游戏源代码免费素材网站 资源贼多&#xff0c;重点是免费&#xff01;&#xff01;&#xff01;白嫖一时爽&#xff0c;一直白嫖一直爽&#xff0c;嘿嘿嘿&#xff01;&#xff01;&#xff01;感兴趣的可以进去看看 接下来就…

java连连看代码_java实现连连看游戏

本文实例为大家分享了java实现连连看游戏的具体代码,供大家参考,具体内容如下 代码会实现共享的,这个是截图 代码: package com.lr.bean; import java.util.Scanner; import java.util.Random; import com.lr.bean.Point; public class Link{public static void main(Strin…

JAVA版扫雷游戏,清晰易懂,注释多

这是一篇关于JAVA的扫雷游戏&#xff0c;所有的图片均用文字代替&#xff0c;代码可直接运行。 文章目录 开发环境一、下载方法二、运行效果展示三、代码部分1.代码如下 总结 开发环境 开发工具&#xff1a;eclipse2021-12 JDK版本&#xff1a;JDK15.0.1 一、下载方法 链接&a…

猜数字游戏(Java源代码)

游戏后台随机生成1-20之间的5个数&#xff0c;未猜中提示“未命中”&#xff0c;继续猜测&#xff0c;猜中提示“运气不错&#xff0c;猜中了”&#xff0c;并输出数据出现的第一次位置源代码&#xff1a; import java.util.Random; import java.util.Scanner;//游戏后台随机…

JAVA实现扫雷游戏

后记&#xff1a;经评论区提醒&#xff0c;发现有两个bug没考虑到&#xff0c;感谢大家的提醒 bug1&#xff1a;绘制雷的时候有可能把两个雷随机到同样的位置。解决方法是在绘制雷的for循环内&#xff0c;rRow和rCol生成后做一个检测即可&#xff1a; /* 绘制地雷 */private v…

Java抽奖小游戏(包含代码)

情景&#xff1a; 假如从50个数字中确定10个中奖号码。 中奖号码要从50个数字中随机产生&#xff0c;中奖号码不可以重复&#xff0c;并对中奖号码进行排序。 解题思路&#xff1a; 首先建立一个长度为n号码的号码库&#xff1a;建立一个数组存放k个中奖号码抽取k个中奖号码。…

贪吃蛇java游戏代码_java实现贪吃蛇游戏代码(附完整源码)

先给大家分享源码&#xff0c;喜欢的朋友点此处下载。 游戏界面 GUI界面 java实现贪吃蛇游戏需要创建一个桌面窗口出来&#xff0c;此时就需要使用java中的swing控件 创建一个新窗口 JFrame frame new JFrame("贪吃蛇游戏"); //设置大小 frame.setBounds(10, 10, 90…

JAVA 实现生命游戏

生命游戏的规则: 生命游戏中&#xff0c;对于任意细胞&#xff1a;每个细胞有两种状态&#xff1a;存活或死亡。每个细胞与以自身为中心的周围八格细胞产生互动。    1.当前细胞为存活状态时&#xff0c;当周围的活细胞低于2个时&#xff0c; 该细胞因孤独而死亡;    2.当…