Android _ 《看完不忘系列》之Glide

Android Glide使用姿势与原理分析_安卓 glide 自定义图片压缩策略通过实现接口实现。该接口包含方法,可以在其中定义自定义的压缩操作。// 自定义压缩算法return "customTransformation" // 返回唯一标识符,用于缓存// 自定义压缩算法实现// ....load(url)通过实现接口,你可以根据需求制定不同的压缩算法,以满足特定的图片压缩需求。 阅读详情

Glide glide = Glide.get(context);
//如果空fragment没有RequestManager,就创建一个
requestManager = factory.build(glide, current.getGlideLifecycle(),
current.getRequestManagerTreeNode(), context);
//让空fragment持有RequestManager
current.setRequestManager(requestManager);
}
//返回页面级别的RequestManager
return requestManager;
}
}`

然后看到getSupportRequestManagerFragment方法,

class RequestManagerRetriever implements Handler.Callback { Map<FragmentManager, SupportRequestManagerFragment> pendingSupportRequestManagerFragments = new HashMap<>(); SupportRequestManagerFragment getSupportRequestManagerFragment( final FragmentManager fm, Fragment parentHint, boolean isParentVisible) { //通过tag找到Activity中的空fragment SupportRequestManagerFragment current = (SupportRequestManagerFragment) fm.findFragmentByTag(FRAGMENT_TAG); if (current == null) { //findFragmentByTag没找到空fragment,有可能是延迟问题?再从Map中找一下 current = pendingSupportRequestManagerFragments.get(fm); if (current == null) { //确实没有空fragment,就创建一个 current = new SupportRequestManagerFragment(); //... //缓存进Map pendingSupportRequestManagerFragments.put(fm, current); //空fragment添加到Activity,使其能感知Activity的生命周期 fm.beginTransaction().add(current, FRAGMENT_TAG).commitAllowingStateLoss(); //... } } return current; } }

综上,通过with操作,

当context是app时,得到应用级别RequestManager全局单例;

当context是Activity时,每个页面都会被添加一个空fragment,由空fragment持有页面级别RequestManager。

注意:如果with发生在子线程,不管context是谁,都返回应用级别RequestManager单例。

发散:添加空fragment来感知页面生命周期的思想,在Lifecycle的实现中也可以看到,见[ReportFragment](()的injectIfNeededIn方法。(不过这个方法在Lifecycle的2.2.0版本中有所改动,Android 10开始的设备改成了使用Application.ActivityLifecycleCallbacks来感知,感兴趣可以康康)

至此,我们根据存款context买到了心仪的车RequestManager,下面开始上牌~

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WmZ3PVyU-1651894368815)(https://user-gold-cdn.xitu.io/2020/7/15/17351bf3c4419b10?imageView2/0/w/1280/h/960/ignore-error/1)]

load:上牌

load方法得到了一个RequestBuilder图片请求构建器,见名知意猜一下,是用来创建图片请求的,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Yd1Z6Ut-1651894368816)(https://user-gold-cdn.xitu.io/2020/7/15/17351bf3c6376312?imageView2/0/w/1280/h/960/ignore-error/1)]

class RequestManager implements ComponentCallbacks2, LifecycleListener, ModelTypes<RequestBuilder<Drawable>> { RequestBuilder<Drawable> load(String string) { return asDrawable().load(string); } RequestBuilder<Drawable> asDrawable() { //需要加载的类型为Drawable return as(Drawable.class); } <ResourceType> RequestBuilder<ResourceType> as(Class<ResourceType> resourceClass) { //创建一个请求构建器 return new RequestBuilder<>(glide, this, resourceClass, context); } }

然后跟进asDrawable().load(string),

class RequestBuilder<TranscodeType> extends BaseRequestOptions<RequestBuilder<TranscodeType>> implements Cloneable, ModelTypes<RequestBuilder<TranscodeType>> { RequestBuilder<TranscodeType> load(String string) { return loadGeneric(string); } RequestBuilder<TranscodeType> loadGeneric(@Nullable Object model) { //只是简单地赋值 this.model = model; isModelSet = true; return this; } }

到这里,我们就完成了上牌,得到了一个RequestBuilder图片请求构建器。没错,上牌就这么简单,毕竟摇号已经够艰难了对吧?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wvKuc2Vp-1651894368816)(https://user-gold-cdn.xitu.io/2020/7/15/17351bf3cbd9f2d6?imageView2/0/w/1280/h/960/ignore-error/1)]

into:发车

阶段一

来到into了,

class RequestBuilder<TranscodeType> extends BaseRequestOptions<RequestBuilder<TranscodeType>> implements Cloneable, ModelTypes<RequestBuilder<TranscodeType>> { ViewTarget<ImageView, TranscodeType> into(ImageView view) { //... BaseRequestOptions<?> requestOptions = this; if (!requestOptions.isTransformationSet() && requestOptions.isTransformationAllowed() && view.getScaleType() != null) { //根据ImageView的ScaleType,来配置参数 switch (view.getScaleType()) { case CENTER_CROP: requestOptions = requestOptions.clone().optionalCenterCrop(); break; case CENTER_INSIDE: requestOptions = requestOptions.clone().optionalCenterInside(); break; //... } } return into( //前面提到,Target是展示图片的载体,这里他封装了ImageView glideContext.build **《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】** ImageViewTarget(view, transcodeClass),null, requestOptions,Executors.mainThreadExecutor()); } }

继续跟进into重载方法,

class RequestBuilder<TranscodeType> extends BaseRequestOptions<RequestBuilder<TranscodeType>> implements Cloneable, ModelTypes<RequestBuilder<TranscodeType>> { <Y extends Target<TranscodeType>> Y into(Y target,RequestListener<TranscodeType> targetListener, BaseRequestOptions<?> options,Executor callbackExecutor) { //... //创建图片请求 Request request = buildRequest(target, targetListener, options, callbackExecutor); //获取Target载体已有的请求 Request previous = target.getRequest(); //如果两个请求等效,并且xxx(先忽略) if (request.isEquivalentTo(previous) && !isSkipMemoryCacheWithCompletePreviousRequest(options, previous)) { if (!Preconditions.checkNotNull(previous).isRunning()) { //启动异步请求 previous.begin(); } return target; } requestManager.clear(target); //图片载体绑定图片请求,即imageView setTag为request target.setRequest(request); //启动异步请求 requestManager.track(target, request); return target; } }

跟进requestManager.track(target, request),

//RequestManager.java void track(Target<?> target,Request request) { targetTracker.track(target); requestTracker.runRequest(request); } //RequestTracker.java void runRequest(Request request) { requests.add(request); if (!isPaused) { //开启图片请求 request.begin(); } else { request.clear(); //如果处于暂停状态,就把请求存起来,晚些处理 pendingRequests.add(request); } }

到这里,就启动了图片请求,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UZsPMrkM-1651894368817)(https://user-gold-cdn.xitu.io/2020/7/15/17351bf3eb65acdb?imageView2/0/w/1280/h/960/ignore-error/1)]

阶段二

那么,接下来重点关注的就是request.begin()了,

class SingleRequest<R> implements Request, SizeReadyCallback, ResourceCallback { void begin() { synchronized (requestLock) { //... if (Util.isValidDimensions(overrideWidth, overrideHeight)) { //如果已经有了明确的尺寸,开始加载 onSizeReady(overrideWidth, overrideHeight); } else { //没有的话先去获取尺寸,最终还是走onSizeReady target.getSize(this); } //... } } void onSizeReady(int width, int height) { synchronized (requestLock) { //... //engine.load,传了很多参数 loadStatus = engine.load(glideContext,model, requestOptions.getSignature(), this.width,this.height, requestOptions.getResourceClass(), transcodeClass,priority, requestOptions.getDiskCacheStrategy(), //... this,callbackExecutor); //... } } }

跟进engine.load,

class Engine implements EngineJobListener,MemoryCache.ResourceRemovedListener, EngineResource.ResourceListener { <R> LoadStatus load( GlideContext glideContext, //... Executor callbackExecutor) { //... EngineResource<?> memoryResource; synchronized (this) { //从内存加载 memoryResource = loadFromMemory(key, isMemoryCacheable, startTime); if (memoryResource == null) { //如果内存里没有缓存,则加载 return waitForExistingOrStartNewJob( glideContext, model, //... key, startTime); } } cb.onResourceReady(memoryResource, DataSource.MEMORY_CACHE); return null; } <R> LoadStatus waitForExistingOrStartNewJob(...) { //... EngineJob<R> engineJob =engineJobFactory.build(...); DecodeJob<R> decodeJob =decodeJobFactory.build(...); jobs.put(key, engineJob); //添加回调,这个cb就是SingleRequest自己,todo1 engineJob.addCallback(cb, callbackExecutor); //engineJob开启decodeJob engineJob.start(decodeJob); return new LoadStatus(cb, engineJob); } }

DecodeJob是一个Runable,看看他的run方法,调用链如下:

DecodeJob.run -> DecodeJob.runWrapped -> DecodeJob.runGenerators ->

SourceGenerator.startNext -> SourceGenerator.startNextLoad ->

MultiModelLoader#MultiFetcher.loadData ->

HttpUrlFetcher.loadData

来到HttpUrlFetcher,

class HttpUrlFetcher implements DataFetcher<InputStream> { void loadData(Priority priority, DataCallback<? super InputStream> callback) { try { //获取输入流,没有引入okhttp,则使用HttpURLConnection InputStream result = loadDataWithRedirects(glideUrl.toURL(), 0, null, glideUrl.getHeaders()); //回调出去 callback.onDataReady(result); } catch (IOException e) { callback.onLoadFailed(e); } finally { } } }

到这里,网络请求就完成了,下面看看图片是怎么设置上去的,前边留了个todo1,

//添加回调,这个cb就是SingleRequest自己,todo1

callback就是SingleRequest,被回调前有一些对象包装、解码操作,暂不深究,来到SingleRequest,

null, glideUrl.getHeaders());
//回调出去
callback.onDataReady(result);
} catch (IOException e) {
callback.onLoadFailed(e);
} finally {
}
}
}`

到这里,网络请求就完成了,下面看看图片是怎么设置上去的,前边留了个todo1,

//添加回调,这个cb就是SingleRequest自己,todo1

callback就是SingleRequest,被回调前有一些对象包装、解码操作,暂不深究,来到SingleRequest,

Glide系列:Glide从url中获取Bitmap 最近在做微信分享产品网页链接,需要把图片的url转为byte[],所以先要生成Bitmap。 Glide 4.9版本 配置网络权限 <uses-permission android:name="android.permission.INTERNET"/> 导入Glide库 implementation 'com.github.bumptech.glide:glide:4.9.0' 4.9版本,之前的许多方式都废弃了,用submit()方法,必须要开新的线程。 下面是MainAct. 阅读详情

相关推荐

VTK vtkLookupTable vtkScalarBarActor 颜色条

有时需要给数据做一个 vtkScalarBarActor, 我们把显示的数据的一个 坐标系 来显示 颜色条1.以 Z 显示颜色 效果如下。

q610098308的专栏 4033

Glide 之 Registry、ModelLoaderRegistry、 MultiModelLoaderFactory、 ModelLoader 分析

Registry Manages component registration to extend or replace Glide's default loading, decoding, and encoding logic. 它的主要工作是在Glide初始化的时候做的,我们截取一段代码看看 首先看看ModelLoader相关的 registry .appen...

“点点”专栏 1402

AI影像组学在结直肠癌诊疗中的应用:从特征提取到临床决策

影像组学通过高通量计算从医学影像中提取定量特征,揭示肿瘤内部的微观生物学行为,这些特征反映了纹理异质性、形状不规则度等影像表型。其核心原理在于将图像数据转化为可分析的数字特征,结合机器学习算法进行模式识别,从而实现对疾病状态的精准预测。这一技术的价值在于能够无创、定量地评估肿瘤特性,为精准医疗提供关键支持。在临床实践中,AI驱动的影像组学模型广泛应用于结直肠癌的诊疗全链条,包括肿瘤良恶性鉴别、基因突变预测、治疗反应评估和预后分析等场景。通过整合影像组学特征与临床数据,可以构建预测模型,辅助医生进行更准确的诊

weixin_28295799的博客 409

Android | 《看完不忘系列》之Glide

《看完不忘系列》将以从树干到细枝的思路来分析一些技术框架,本文是开篇文章,将对开源项目Glide图片加载库进行介绍。如果老铁们看完还是忘了,就 回来揍我一顿 点赞收藏加关注,多看两遍~ 概览 基于Glide最新版本4.11.0,未迁AndroidX的项目只能使用4.9.0,简单使用: 引入依赖,app/build.gradle: implementation 'com.github.bumptech.glide:glide:4.11.0' annotationProcessor 'com.github.b

哈利迪 329

(Cascade extended state observer)级联ADRC的simulink仿真和程序---送给中国研究学者的精华版

(Cascade extended state observer)级联ADRC的simulink仿真和程序---送给中国研究学者的精华版

weixin_44312889的博客 3778

C# WinForms实战:5分钟用ScottPlot打造专业级示波器界面(附完整代码)

本文详细介绍了如何在C# WinForms应用中,利用ScottPlot.WinForms库快速构建一个专业级的软件示波器界面。通过从环境配置、静态波形绘制到动态数据实时更新的完整实战演示,帮助开发者高效实现高性能的波形显示功能,适用于工业监控、信号分析等多种场景。

weixin_29198045的博客 831

Android 安卓Glide加载圆角

写好了一个工具类 要在自己项目中build.gradle加入以下内容(导入Glide) implementation('com.github.bumptech.glide:glide:4.7.1') { exclude group: "com.android.support" } 可以自己设置圆角度数,也可以自动设置,如第5行,我写了20 public class Glide...

两行代码 踏踏实实de工作 3680

Python 逆向解析知乎盐选反爬字体,实现内容精准还原

本文详细解析了知乎盐选内容的反爬字体机制,并提供了使用Python逆向解析WOFF字体文件的完整方案。通过fontTools库构建解码字典,实现乱码文本的精准还原,帮助开发者应对动态字体策略,同时强调法律与道德风险。

weixin_29268385的博客 1295

android Glide简单使用

今天,简单讲讲Android里Glide的简单使用。   Android框架系列: 一.android EventBus的简单使用 二.android Glide简单使用   对于Glide这个加载图片的框架,很多人都在用,我之前使用的是ImageLoader,最近查资料时,发现Glide才是Google推荐的加载图片框架,功能非常强大,而且还有Google专人维护,要知道,Image...

谢岩的博客 4万+

抖音最新风控体系研究

小编从技术角度对抖音的风控史和落地目标,跟大家聊一聊抖音,包括海外版抖音TikTok的现状与生态。 1、非常非常早的时期,抖音刚出来的时候,没有任何封禁,这个阶段,导入一个开发库,加上一个请求头,咵咵咵的数据随便拿。 2、2018-2019年,抖音加入了设备id和xg机制,在绝大多数的接口中,携带了设备id参数,同时在请求头中加入了xg,如今的apk市场,能追溯到的最早xg是0200打头的,而小编见过的最早的xg是0000打头的。这个时期的接口,这些参数都还只是预设,没有实际的用处,设备随便写,

qq517348412的博客 1万+

(四)C++自制植物大战僵尸游戏启动流程

鼠标左键单机VS2022上方工具栏中进行项目启动。第一次启动项目需要编译项目中所有代码文件,编译生成需要一定的时间。不同性能的电脑需要消耗的时间差别可能较大,通常在几分钟到几十分钟之间。编译成功后会自动启动运行游戏。qi编译成功后自动启动运行游戏如下图。

尔灵尔亿的博客 2466

Android中Glide的使用

第1章 Glide的使用 1.1 Glide的概述 Glide,就像 Picasso,可以从多个源去加载和显示图片,同时也兼顾缓存和在做图片处理的时候维持一个低内存消耗。它已经在 Google 官方 APP (如 Google 2015开发者大会的应用程序)中使用了,就和 Picasso 一样受欢迎。 1.2 Glide的引入 1.2.1 Glide的配置 在AndroidMainFest.xml中添加以下代码: dependencies { implementation 'com

晨曦的博客 8629

DeepSeek + 微信:手把手教你把 AI 接入个人微信,秒变“高情商”聊天助手(防封指南)

将 DeepSeek 接入微信,本质上是给你的微信装了一个**“最强外挂”**。它不仅能帮你回消息,还能帮你写周报、查资料、甚至陪聊解闷。工具是服务于人的,不要让 AI 完全替代了你的真情实感。毕竟,真正的高情商,是屏幕背后那个在乎对方的你。先申请一个小号,按照步骤跑通流程。然后试着调整 Prompt,训练一个属于你自己的“嘴替”吧!

BUG猿的博客 957

Android-Glide详解

Glide目前是安卓最主流的加载图片的框架,也是源码最为复杂的框架之一。要想完完全全吃透Glide的源码,可能需要半年甚至更多的时间。但是如果分析过Glide的源码,不仅对我们的架构能力有很大提高,也会对面试中的关于Glide的问题知其然更知其所以然。Glide的精髓,在于它的生命周期的管理和缓存策略。

袁震的博客 2915

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Android Glide

或做了某些类型的修改后,你可能需要重新构建 (rebuild) 你的项目。当待加载的图片包含透明像素时,禁用交叉淡入会导致动画完成后占位符在图片后面仍然可见。3. fallback 如果请求的url/model为 null 的时候展示的图片 (如果没有设置,还是展示placeholder的占位符)2. error 如果请求失败的时候展示的图片 (如果没有设置,还是展示placeholder的占位符)Transitions定义 Glide 如何从占位符到新加载的图片,或从缩略图到全尺寸图像过渡。

weixin_53324768的博客 2672

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android Glide 原理解析

Android Glide 原理解析一.提供的功能特性二.简单使用三.源码结构1.内存缓存(1)MemoryCache(2)BitmapPool(3)二级内存缓存2.磁盘缓存3.图片对应的Key4.Glide对象5.RequestManager—绑定生命周期6.GenericRequestBuilder对象7.Target对象8.RequestTracker对象9.Engine、EngineJob...

依生依世 7655

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Android深入了解Glide

Glide 从源码角度刨析其精彩之处 持续更新

weixin_44780781的博客 2793

Android最火的框架系列(六)Glide

Android开源的图片加载框架有很多,常见的四种分别是:ImageLoader、Picasso、Glide和Fresco。其实,这些框架加载普通的图片,使用方法都差不多。这篇文章,我也不会花很多的篇幅去比较几种框架的优缺点。 这几种框架我都使用过,都是比较简单的几行代码就可以实现图片的加载。在实际项目开发中,我基本是使用Glide。放一下GitHub上的s...

zhaojun的博客 2万+

android glide 清除缓存,安卓内存清理之Glide

项目中使用了glide加载图片设置中要求能够清理用户缓存计算缓存大小:new GetDiskCacheSizeTask().execute(new File(context.getCacheDir(),DiskCache.Factory.DEFAULT_DISK_CACHE_DIR));//开启Task任务进行计算class GetDiskCacheSizeTask extends AsyncTa...

weixin_39900180的博客 1226

Android开源库——Glide

Android的图像加载和缓存库,专注于平滑滚动。

松仔Log的博客 1099

Android Glide 的使用总结

Android Glide 的使用总结初识在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫 Glide 的图片加载库,作者是bumptech。这个库被广泛的运用在google的开源项目中,包括2014年google I/O大会上发布的官方app。之前很多同学都看到过这篇介绍Glide的文章,原文在这里。文中从各个方面介绍和比较了Glide与Picasso,总体来说二者极为相似,有着近乎相同的A

Wman 4015

安卓通过Glide实现图片旋转

实现方法 添加依赖 dependencies { ... implementation 'com.github.bumptech.glide:glide:4.11.0' kapt 'com.github.bumptech.glide:compiler:4.11.0' } 旋转方法 /** * 将imageView里显示的图片旋转指定的角度 * @param i...

蓝不蓝编程 1936

Android万能的图片加载框架(Glide、Fresco、Picasso)

做安卓开发中加载图片是一个很常用的功能,但是如果没写好的话,很容易产生OOM,这里介绍几个好用的开源的图片加载框架。 第一个是Glide,Glide一般是配合PhotoView来使用的,轻松实现图片放大、缩小和双击放大等功能。具体的用法我就不再重复写了,这里推荐几个博客,写得很详细,看完就明白了。 http://mrfu.me/2016/02/27/Glide_Getting_Started/

从事移动开发八年,csdn博客专家,阿里云特邀专家,华为云云享专家,高级网络信息安全工程师,大数据工程师(高级),python技术开发(高级),HarmonyOS 应用开发者高级认证,现在某学校任教。 8065

glide android_Android Glide范例教学

glide androidHere you will get android glide tutorial with example. 在这里,您将获得带有示例的android glide教程。 Glide is an android library that allows us to fetch image from internet or url in single line of cod...

culing2941的博客 454
上一篇: Android Room 实现简单的增删改查(一)
下一篇: Android 仿淘宝物流信息TimeLineView
Android_1314
博客等级 码龄5年 1粉丝 70原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值