【Android】画面卡顿优化列表流畅度四之Glide几个常用参数设置

好像是一年前快两年了,笔者解析过glide的源码,也是因为觉得自己熟悉一些,也就没太关注过项目里glide的具体使用对当前业务的影响;主要是自负,还有就是真没有碰到过这样的数据加载情况。暴露了经验还是不太足够
有兴趣的可以去瞅瞅,就是对源码的解释而已比较枯燥乏味。也是因为有了这个积累才能找到比较合适的参数比解决当前的问题:
传送门:Glide源码解析
在这里插入图片描述
优化之前的用法如下:

 					Glide.with(context).load(imgUrl).into(holder.imageview);

因为不是笔者自己写的这段加载逻辑,所以笔者也没改动,呃!搞开发的都知道,程序能运行就别动;再说笔者就是一个小虾米,又在一个还算那啥的体系里。多一事不如少一事,搞开发也要讲讲人情世故蛤!不过一年前负责这块的开发跳槽了,据说工资涨了一大截;也算是happy跳槽。

优化之后的图片加载渲染就顺畅很多了,再没有上下滑动过程中出现的那种一顿一顿的画面顿感了,解决了在滑动过程中因为网络图片过重导致的渲染卡顿问题

下面针对几个优化参数设置进行细化解析:

thumbnail(0~1.0f)

原文介绍如下:

/*** Loads a resource in an identical manner to this request except with the dimensions of the* target multiplied by the given size multiplier. If the thumbnail load completes before the full* size load, the thumbnail will be shown. If the thumbnail load completes after the full size* load, the thumbnail will not be shown.** <p>Note - The thumbnail resource will be smaller than the size requested so the target (or* {@link ImageView}) must be able to scale the thumbnail appropriately. See* {@link android.widget.ImageView.ScaleType}.** <p>Almost all options will be copied from the original load, including the {@link* com.bumptech.glide.load.model.ModelLoader}, {@link com.bumptech.glide.load.ResourceDecoder},* and {@link com.bumptech.glide.load.Transformation}s. However,* {@link com.bumptech.glide.request.RequestOptions#placeholder(int)} and* {@link com.bumptech.glide.request.RequestOptions#error(int)}, and* {@link #listener(RequestListener)} will only be used on the full size load and will not be* copied for the thumbnail load.** <p>Recursive calls to thumbnail are supported.** <p>Overrides any previous calls to this method, {@link #thumbnail(RequestBuilder[])},*  and {@link #thumbnail(RequestBuilder)}.** @see #thumbnail(RequestBuilder)* @see #thumbnail(RequestBuilder[])** @param sizeMultiplier The multiplier to apply to the {@link Target}'s dimensions when loading*                       the thumbnail.* @return This request builder.*/@NonNull@CheckResult@SuppressWarnings("unchecked")public RequestBuilder<TranscodeType> thumbnail(float sizeMultiplier) {if (sizeMultiplier < 0f || sizeMultiplier > 1f) {throw new IllegalArgumentException("sizeMultiplier must be between 0 and 1");}this.thumbSizeMultiplier = sizeMultiplier;return this;}

GPT翻译如下:

/**以与此请求相同的方式加载资源,但是目标的尺寸乘以给定的尺寸倍数。如果缩略图加载在完整尺寸加载之前完成,将显示缩略图。如果缩略图加载在完整尺寸加载之后完成,将不会显示缩略图。<p>注意 - 缩略图资源将小于请求的尺寸,因此目标(或{@link ImageView})必须能够适当地缩放缩略图。请参阅{@link android.widget.ImageView.ScaleType}。
<p>几乎所有选项都将从原始加载复制,包括{@link com.bumptech.glide.load.model.ModelLoader}、{@link com.bumptech.glide.load.ResourceDecoder}和{@link com.bumptech.glide.load.Transformation}。但是,{@link com.bumptech.glide.request.RequestOptions#placeholder(int)}和{@link com.bumptech.glide.request.RequestOptions#error(int)},以及{@link #listener(RequestListener)} 仅在完整尺寸加载时使用,并且不会被复制到缩略图加载。
<p>支持对缩略图的递归调用。
<p>覆盖对此方法的先前调用,{@link #thumbnail(RequestBuilder[])}和{@link #thumbnail(RequestBuilder)}。
@see #thumbnail(RequestBuilder)@see #thumbnail(RequestBuilder[])@param sizeMultiplier 加载缩略图时要应用于{@link Target}尺寸的倍数。@return 此请求构建器。 */ 

优化之前的,这个空白和缩略图没有关系蛤!
优化之前的效果没有图片加载就是空白的

优化之后的实际效果展示:
在这里插入图片描述
也是由于图片太重了,当这个方法加上的时候,上下滑动立马就顺畅了很多,笔者实际使用的参数值是:
在这里插入图片描述
0.0625f 这个参数值我自己都惊讶了!不要问这个参数怎么来的,问就是二分法
好,接着设置RequestOptions

RequestOptions

下面是优化后的使用

public static RequestOptions buildRequestOptions(Context context, int resId) {if (null != gridAdapterRequestOptions)return gridAdapterRequestOptions;gridAdapterRequestOptions = RequestOptions.noTransformation();return gridAdapterRequestOptions.sizeMultiplier(0.85f)
//                .skipMemoryCache(true) // 跳过内存缓存
//                .onlyRetrieveFromCache(true)//                .diskCacheStrategy(DiskCacheStrategy.NONE) // 跳过磁盘缓存.override(63 * 2, 112 * 2).dontAnimate()
//                .error(resId).placeholder(resId);}

placeholder(resId)

这个大家都熟悉就不解释了,贴个原文水一下:

/*** Sets an Android resource id for a {@link Drawable} resource to* display while a resource is loading.** @param resourceId The id of the resource to use as a placeholder* @return This request builder.*/@NonNull@CheckResultpublic RequestOptions placeholder(@DrawableRes int resourceId) {if (isAutoCloneEnabled) {return clone().placeholder(resourceId);}this.placeholderId = resourceId;fields |= PLACEHOLDER_ID;return selfOrThrowIfLocked();}

error(resId)虽然没有用到(产品不让)

也得水一下原文,虽然经常用,但也要温顾一下:

 /*** Sets a resource to display if a load fails.** @param resourceId The id of the resource to use as a placeholder.* @return This request builder.*/@NonNull@CheckResultpublic RequestOptions error(@DrawableRes int resourceId) {if (isAutoCloneEnabled) {return clone().error(resourceId);}this.errorId = resourceId;fields |= ERROR_ID;return selfOrThrowIfLocked();}

.dontAnimate()

这个到用的不是特别多,也是刚好碰到这个业务场景要尽量降低渲染耗时:

 /*** Disables resource decoders that return animated resources so any resource returned will be* static.** <p> To disable transitions (fades etc) use* {@link com.bumptech.glide.TransitionOptions#dontTransition()}</p>*/// Guaranteed to modify the current object by the isAutoCloneEnabledCheck.@SuppressWarnings("CheckResult")@NonNull@CheckResultpublic RequestOptions dontAnimate() {return set(GifOptions.DISABLE_ANIMATION, true);}
/**禁用返回动画资源的资源解码器,因此返回的任何资源都将是静态的。
<p>要禁用过渡效果(淡入淡出等),请使用{@link com.bumptech.glide.TransitionOptions#dontTransition()}</p>
*/ // 通过isAutoCloneEnabledCheck保证修改当前对象。

好像不一定能生效,这个没有亲测是否有实际作用。但还是先禁用比较好。适配几年前旧手机尽可能释放手机性能。

.override(int width, int height)

override(int width, int height) 就很实用了
再回顾一下,后台给笔者的网络图片,唉!重的笔者都看的眼晕:
在这里插入图片描述
都是这样的1080 x 1920左右的能直接上2K的大分辨率图片。距离我理想的126 x 224差了何止10倍,粗算一下快100倍了。呃!吐槽一下!
override(int width, int height)原文如下:

/*** Overrides the {@link com.bumptech.glide.request.target.Target}'s width and height with the* given values. This is useful for thumbnails, and should only be used for other cases when you* need a very specific image size.** @param width  The width in pixels to use to load the resource.* @param height The height in pixels to use to load the resource.* @return This request builder.*/@NonNull@CheckResultpublic RequestOptions override(int width, int height) {if (isAutoCloneEnabled) {return clone().override(width, height);}this.overrideWidth = width;this.overrideHeight = height;fields |= OVERRIDE;return selfOrThrowIfLocked();}
/**使用给定的值覆盖{@link com.bumptech.glide.request.target.Target}的宽度和高度。这对缩略图很有用,只有在需要非常特定的图像尺寸时才应该使用。@param width 用于加载资源的像素宽度。@param height 用于加载资源的像素高度。@return 此请求构建器。 */ 

本来打算设置成9*16那种的,但是叠加了sizeMultiplier、thumbnail之后那效果太辣眼睛了,不是磨砂而是超级加倍的马赛克效果了。基本轮廓都没了。好吧!这样虽然滑动很丝滑但是太粗暴了,对用户不友好,效果图就不展示了,辣眼睛就让笔者一个人背负吧!于是就有了63 * 2, 112 * 2的设置。同理,别问怎么来的,问就是二分法

.diskCacheStrategy(DiskCacheStrategy.NONE)

这个还是要说明一下的,有一定的作用,但对当前场景作用太微弱了
原文:

/*** Sets the {@link DiskCacheStrategy} to use for this load.** <p> Defaults to {@link DiskCacheStrategy#AUTOMATIC}. </p>** <p> For most applications {@link DiskCacheStrategy#RESOURCE} is* ideal. Applications that use the same resource multiple times in multiple sizes and are willing* to trade off some speed and disk space in return for lower bandwidth usage may want to consider* using {@link DiskCacheStrategy#DATA} or* {@link DiskCacheStrategy#ALL}. </p>** @param strategy The strategy to use.* @return This request builder.*/@NonNull@CheckResultpublic RequestOptions diskCacheStrategy(@NonNull DiskCacheStrategy strategy) {if (isAutoCloneEnabled) {return clone().diskCacheStrategy(strategy);}this.diskCacheStrategy = Preconditions.checkNotNull(strategy);fields |= DISK_CACHE_STRATEGY;return selfOrThrowIfLocked();}
/**设置用于此加载的{@link DiskCacheStrategy}。<p>默认为{@link DiskCacheStrategy#AUTOMATIC}。</p>
<p>对于大多数应用程序,{@link DiskCacheStrategy#RESOURCE}是理想的。在多个大小的多次使用相同资源的应用程序中,愿意在速度和磁盘空间方面进行一些折衷以换取较低的带宽使用量的应用程序可能希望考虑使用{@link DiskCacheStrategy#DATA}或{@link DiskCacheStrategy#ALL}。</p>
@param strategy 要使用的策略。@return 此请求构建器。 */

大家都懂蛤!

.onlyRetrieveFromCache(true)

原文:

/**** If set to true, will only load an item if found in the cache, and will not fetch from source.*/@NonNull@CheckResultpublic RequestOptions onlyRetrieveFromCache(boolean flag) {if (isAutoCloneEnabled) {return clone().onlyRetrieveFromCache(flag);}this.onlyRetrieveFromCache = flag;fields |= ONLY_RETRIEVE_FROM_CACHE;return selfOrThrowIfLocked();}
/**如果设置为true,仅在缓存中找到项目时才会加载,不会从源获取。 
*/

笔者是十分希望用这个的,可惜不能满足场景使用要求,它会直接过滤不在本地二级缓存的图片。不符合场景要求。但加载效果体验很丝滑顺畅的。接近京东首页的体验了。

.skipMemoryCache(true) // 跳过内存缓存

 /*** Allows the loaded resource to skip the memory cache.** <p> Note - this is not a guarantee. If a request is already pending for this resource and that* request is not also skipping the memory cache, the resource will be cached in memory.</p>** @param skip True to allow the resource to skip the memory cache.* @return This request builder.*/@NonNull@CheckResultpublic RequestOptions skipMemoryCache(boolean skip) {if (isAutoCloneEnabled) {return clone().skipMemoryCache(true);}this.isCacheable = !skip;fields |= IS_CACHEABLE;return selfOrThrowIfLocked();}
这个方法用于允许加载的资源跳过内存缓存。请注意,这并不是一个保证。如果对于该资源已经有一个挂起的请求,并且该请求也没有跳过内存缓存,那么该资源将被缓存在内存中。@param skip 为true时允许资源跳过内存缓存。
@return 此请求构建器。

某些场景会用到。加深一下印象

.sizeMultiplier(0.85f)

/*** Applies a multiplier to the {@link com.bumptech.glide.request.target.Target}'s size before* loading the resource. Useful for loading thumbnails or trying to avoid loading huge resources* (particularly {@link Bitmap}s on devices with overly dense screens.** @param sizeMultiplier The multiplier to apply to the*                       {@link com.bumptech.glide.request.target.Target}'s dimensions when*                       loading the resource.* @return This request builder.*/@NonNull@CheckResultpublic RequestOptions sizeMultiplier(@FloatRange(from = 0, to = 1) float sizeMultiplier) {if (isAutoCloneEnabled) {return clone().sizeMultiplier(sizeMultiplier);}if (sizeMultiplier < 0f || sizeMultiplier > 1f) {throw new IllegalArgumentException("sizeMultiplier must be between 0 and 1");}this.sizeMultiplier = sizeMultiplier;fields |= SIZE_MULTIPLIER;return selfOrThrowIfLocked();}
/**在加载资源之前,对{@link com.bumptech.glide.request.target.Target}的大小应用乘数。适用于加载缩略图或尝试避免加载庞大资源(特别是在屏幕密度过大的设备上的{@link Bitmap})。@param sizeMultiplier 在加载资源时应用于{@link com.bumptech.glide.request.target.Target}尺寸的乘数。@return 此请求构建器。 */ 

这个十分契合笔者当前也场景,针对那些大而重的网络图片进行处理。

noTransformation()

/*** Returns a {@link RequestOptions} object with {@link #dontTransform()} set.*/@SuppressWarnings("WeakerAccess")@NonNull@CheckResultpublic static RequestOptions noTransformation() {if (noTransformOptions == null) {noTransformOptions = new RequestOptions().dontTransform().autoClone();}return noTransformOptions;}
/**返回一个设置了{@link #dontTransform()}的{@link RequestOptions}对象。 */ 

这个和dontAnimate类似,但体验上没有大的提升效果。也许这个设置是有误的。还是要多进行调试

/*** Similar to {@link #lock()} except that mutations cause a {@link #clone()} operation to happen* before the mutation resulting in all methods returning a new Object and leaving the original* locked object unmodified.** <p>Auto clone is not retained by cloned objects returned from mutations. The cloned objects* are mutable and are not locked.*/@NonNullpublic RequestOptions autoClone() {if (isLocked && !isAutoCloneEnabled) {throw new IllegalStateException("You cannot auto lock an already locked options object"+ ", try clone() first");}isAutoCloneEnabled = true;return lock();}
/**与{@link #lock()}类似,不同之处在于在发生突变之前会执行{@link #clone()}操作,导致所有方法返回一个新的对象,原始的锁定对象保持不变。
<p>自动克隆不会被从突变中返回的克隆对象保留。克隆对象是可变的,并且未被锁定。
*/ 

暂时理解不了为啥要克隆,这里没有介绍克隆的使用场景,后续再观察使用情况。

smartApi接口开发工具推荐

历时一年半多开发终于smartApi-v1.0.0版本在2023-09-15晚十点正式上线
smartApi是一款对标国外的postman的api调试开发工具,由于开发人力就作者一个所以人力有限,因此v1.0.0版本功能进行精简,大功能项有:

  • api参数填写
  • api请求响应数据展示
  • PDF形式的分享文档
  • Mock本地化解决方案
  • api列表数据本地化处理
  • 再加上UI方面的打磨

下面是一段smartApi使用介绍:
在这里插入图片描述

下载地址:

https://pan.baidu.com/s/1kFAGbsFIk3dDR64NwM5y2A?pwd=csdn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/195288.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在线协作工具都有哪些?推荐这10款

如今&#xff0c;互联网的快速发展不仅改变了我们的生活方式&#xff0c;也改变了我们的工作方式。 特别是对于一些与产品设计相关的公司或团体&#xff0c;网络不仅为其设计提供了稳定的资源和灵感&#xff0c;而且为成员之间的沟通和合作提供了更大的便利。 如果您也需要为…

ke11介绍本地,会话存储

代码顺序: 1.设置input,捕获input如果有多个用属性选择符例如 input[typefile]点击事件.向我们的本地存储设置键值对 2.在点击事件外面设置本地存储表示初始化的值.点击上面的事件才能修改我们想修改的值 会话(session)浏览a数据可以写到本地硬盘,关闭页面数据就没了 本地(…

基于SSM的大学餐厅菜品推荐和点评系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

基于数据库(MySQL)与缓存(Redis)实现分布式锁

分布式锁 分布式锁&#xff1a;分布式锁是在分布式的情况下实现互斥类型的一种锁 实现分布式锁需要满足的五个条件 可见性&#xff1a;多个进程都能看到结果互斥性&#xff1a;只允许一个持有锁的对象的进入临界资源可用性&#xff1a;无论何时都要保证锁服务的可用性&#x…

怎样备份电脑文件比较安全

域智盾软件是一款功能强大的电脑监控软件&#xff0c;它不仅具备实时屏幕监控、行为审计等功能&#xff0c;还能够对电脑文件进行备份和管理。下面将介绍域智盾软件如何备份电脑文件&#xff0c;以确保数据安全。 1、开启文档备份功能 部署后台&#xff0c;然后点击文档安全&a…

无需API实现MySQL与巨量引擎的对接

通过数环通&#xff0c;您可以使用不到几分钟的时间即可实现MySQL与巨量引擎的对接与集成&#xff0c;从而高效实现工作流程自动化&#xff0c;降本增效&#xff01; 1.产品介绍 巨量引擎是字节跳动旗下的营销服务品牌&#xff0c;它整合了字节跳动旗下的产品及海量内容&#…

Diffusion Models CLIP

Introduction to Diffusion Models 生成模型 主要指的是无监督学习中的生成模型&#xff0c;在无监督学习中的主要任务是让机器学习给定的样本&#xff0c;然后生成一些新的东西出来。比如&#xff1a;给机器看一些图片&#xff0c;能够生成一些新的图片出来&#xff0c;给机器…

Jmeter进行压力测试不为人知的秘密

jmeter是apache公司基于java开发的一款开源压力测试工具&#xff0c;体积小&#xff0c;功能全&#xff0c;使用方便&#xff0c;是一个比较轻量级的测试工具&#xff0c;使用起来非常简单。因为jmeter是java开发的&#xff0c;所以运行的时候必须先要安装jdk才可以。jmeter是免…

窗口管理工具 Mosaic mac中文版功能特点

MosAIc mac是一种窗口管理工具&#xff0c;可帮助您在计算机屏幕上有效地组织和管理多个应用程序窗口。它提供了一种直观的方式来调整和排列窗口&#xff0c;以最大化工作效率。 MosAIc mac窗口管理软件功能和特点 窗口布局&#xff1a;MosAIc允许您选择不同的窗口布局&#x…

跟李沐学AI-深度学习课程00-03【预告、课程安排、深度学习介绍、安装】

目录 00 预告 01 课程安排 02 深度学习介绍 03 安装 本地安装 04 数据操作数据预处理 数据操作 数据类型 创建数组 访问元素 数据操作实现 入门 运算符 广播机制 索引和切片 节省内存 转换为其他Python对象 数据预处理实现 读取数据集 处理缺失值 转换为张…

【Linux】环境变量--PATH环境变量/环境变量的操作/命令行参数

文章目录 一、PATH环境变量1.什么是PATH环境变量2.如何添加PATH环境变量3.系统中的其他环境变量4.环境变量的来源 二、环境变量的操作1.设置环境变量2.通过getenv获取环境变量3.环境变量的意义 三、命令行参数 一、PATH环境变量 1.什么是PATH环境变量 这里我们先提出一个问题…

Ubuntu22.04离线安装uwsgi问题记录

GCC4.8安装 1、报错信息1&#xff1a; 由于缺少gcc4.8环境导致的无法安装uwsgi 解决方案&#xff1a; 离线安装GCC4.8环境, GCC4.8.5离线安装步骤如下&#xff1a; 1、下载gcc的离线安装包及其依赖包&#xff0c;链接如下&#xff1a; https://download.csdn.net/download/…

科技驱动固定资产管理变革:RFID技术的前沿应用

在当今激烈竞争的商业环境中&#xff0c;企业固定资产管理面临挑战&#xff0c;而RFID技术正以其独特特性和功能性彻底改变资产管理方式。本文将深入探讨RFID技术在固定资产管理中的革命性作用&#xff0c;并解析其应用带来的创新和便利。 RFID技术概述&#xff1a; RFID系统作…

君正X2100 读取CHIP_ID

每个处理器会有一个唯一的ID&#xff0c;这个ID可用做产品序列号&#xff0c;或其它。 X21000的CHIP_ID存放于芯片内部的efuse中&#xff0c;efuse是一次性可可编程存储器&#xff0c;初始值为全0&#xff0c;只能将0改为1&#xff0c;不能将1改为0。芯片出厂前会被写入一些信…

【开源】基于JAVA的智能停车场管理系统

项目编号&#xff1a; S 005 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S005&#xff0c;文末获取源码。} 项目编号&#xff1a;S005&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容A. 车主端功能B. 停车工作人员功能C. 系…

bclinux aarch64 ceph 14.2.10 文件存储 Ceph File System, 需要部署mds: ceph-deploy mds

创建池 [rootceph-0 ~]# ceph osd pool create cephfs_data 64 pool cephfs_data created [rootceph-0 ~]# ceph osd pool create cephfs_metadata 32 pool cephfs_metadata created cephfs_metadata 64 报错 官方说明&#xff1a; 元数据池通常最多可容纳几 GB 的数据。为…

微软宣布计划在 Windows 10 版本 22H2 中引入 AI 助手 Copilot

根据之前的传言&#xff0c;微软宣布计划在 Windows 10 版本 22H2 中引入 AI 助手 Copilot。Copilot 将包含在 Windows 10 家庭版和专业版中。该更新的发布日期尚未公布&#xff0c;但预计将在不久的将来发布。 在一份新闻稿中&#xff0c;微软表示在向 Windows 11 用户提供 Co…

Netty传输object并解决粘包拆包问题

⭐️ 前言 大家好&#xff0c;笔者之前写过一篇文章&#xff0c;《Netty中粘包拆包问题解决探讨》&#xff0c;就Netty粘包拆包问题及其解决方案进行了探讨&#xff0c;本文算是这篇博客的延续。探讨netty传输object的问题。 本文将netty结合java序列化来传输object并解决粘包…

[PyTorch][chapter 63][强化学习-QLearning]

前言&#xff1a; 这里结合走迷宫的例子,重点学习一下QLearning迭代更新算法 0,1,2,3,4 是房间&#xff0c;之间绿色的是代表可以走过去。 5为出口 可以用下图表示 目录&#xff1a; 策略评估 策略改进 迭代算法 走迷宫实现Python 一 策略评估 强化学习最终是为了…

【网络奇遇记】那年我与计算机网络的初相识 —— 网络的体系结构

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. 常见的三种计算机网络体系结构1.1 开放系统互连参考模型1.2 TCP/IP参考模型1.3 原理参考模型 二…