Android RecyleView 使用 Gilde 加载图片引发的卡顿问题

Glide 是一个用于 Android 的图片加载和缓存库。它可以帮助开发者快速、高效地加载网络图片、本地文件和视频帧,并且能够自动缓存图片数据,减少网络请求。Glide 具有良好的性能和易用的 API,支持常见的图片加载需求,例如图片压缩、裁剪和动画等功能。

尽管 Glide 是一个非常优秀的图片加载框架,但是在 RecyleView 上使用 Glide 加载图片还需注意性能问题


在实际的项目中发现 RecyleView 在频繁大幅度的上下滑动时(短时间内使用 Glide 加载了大量的图片)出现了比较明显的卡顿,使用 Profile 查看:

好家伙,内存直接暴涨,虽然 Native 内存上涨并不会直接引发 OOM,但还是会影响应用的稳定性的(比如卡顿),甚至会间接引发 ANR 或 OOM

经研究发现 Glide 在加载图片的过程中,item 被回收后并不会停止加载,而是等待图片加载完成,那怪不得内存上涨成这样,也有可能是手机性能不好加载速度太慢了?


换个性能好的手机试试,还是用 Profile 查看:

 从主观体验上还是会有一些卡顿,从 Profile 上也证实了这一点,因为尽管手机的性能很好,加载图片的速度很快,但会触发大量的 GC(内存抖动),也是会引发卡顿,有 ANR 或 OOM 的风险。

为了解决这个卡顿问题,需要对 RecyleView 在滑动时的加载图片做一些收敛


Glide 也有提供了对应的方法来让我们优化加载图片的过程:

暂停加载图片:Glide.with(context).pauseRequests()

恢复加载图片:Glide.with(context).resumeRequests()

接下来在 RecyleView 的滑动回调中调用即可:

    recycleView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
        override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
            when(newState) {
                RecyclerView.SCROLL_STATE_DRAGGING -> { // 拖动时
                    Glide.with(context).pauseRequests()
                }
                RecyclerView.SCROLL_STATE_SETTLING -> { // 惯性滑动时

                }
                RecyclerView.SCROLL_STATE_IDLE -> { // 静止时
                    Glide.with(context).resumeRequests()
                }
            }
        }
    })

可以根据自己的业务需求和用户体验自行调整

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

局部与整体的关联特性,如图所示

局部与整体的关联特性是指事物的局部部分与整体之间存在一定的关联关系。它强调整体是由局部构成,局部又反向影响整体。具体包括以下几个方面的特性: 互依性:局部与整体相互依赖,一个的变动会影响另一个的变动。局部的变化会对整体…

bootstrap5实现蛋糕店网页Bakery设计模板

一、需求分析 蛋糕店的网页通常是指蛋糕店的官方网站。这些网页的功能可以因店铺而异,但一般会包含以下内容: 主页:主页通常是网站的起点,展示店铺的品牌形象、特色蛋糕和推广信息。主页通常会设计成吸引人眼球、易于导航的页面。…

vue3 vuedraggable draggable element must have an item slot

vue3vite 看官网使用这种<template #item“{ element }”> <draggablev-model"myArray"start"onStart"end"onEnd":sort"false"item-key"id"draggable".item"handle".mover" ><template…

java发送邮件到qq邮箱

自己的授权码自己记好 引入依赖 <dependency><groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId><version>1.6.2</version> </dependency> <dependency><groupId>javax.mail</groupId>&…

机器视觉系统选型-镜头选型常见误区—焦距选择公式

视觉工程师在选择镜头时经常要用到一个公式来选择镜头的焦距。根据这个公式&#xff0c;如果 已知芯片大小、拍摄视野和工作距离的要求&#xff0c;可以算出镜头的焦距。在大部分情况下&#xff0c;这个 公式是可以用的。但这只是一个近似公式&#xff0c;有些情况下使用这个公…

广义双曲分布、KS检验与抄底沪指

上一篇笔记我们抛出一个问题&#xff0c;沪指大跌 4%时&#xff0c;能不能抄底&#xff1f;今天的笔记&#xff0c;我们就通过 KS 检验&#xff0c;找出沪指的概率分布&#xff0c;进而回答这个问题。在后面的笔记中&#xff0c;我们还将换一个方法继续回答这个问题。 K-S 检验…

Matlab/F#/R进行数据分析和建模算法的经验,vb.net输给他了

微软放弃了vb.net的开发&#xff0c;但是持续花费巨资投入F#,简单一看他的语法就是qbasic ,vb6一样。鹿死谁手&#xff0c;谁能相信vb.net竟然被f#给干掉了。外面有vb6语法的python成了全球第一的编程语言,内部还有强大的教授开发的这工具扯后腿。 有人说为什么中国搞不出像mat…

漏洞复现--天融信TOPSEC两处远程命令执行

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置(6)

接前一篇文章&#xff1a;《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置&#xff08;5&#xff09; 2.2 HOST主桥 本节以MPC8548处理器为例&#xff0c;说明HOST主桥在PowerPC处理器中的实现机制&#xff0c;并简要介绍x86处理器系统使用的HOST主桥。 …

一文讲透Stata计量经济学中如何分中东西区域回归?

stata如何分中东西区域回归本质上是异质性检验。 异质性检验即针对样本进行分类分组&#xff0c;基于各组样本分别开展的实证检验。异质性检验通常在基准回归之后&#xff0c;基准回归依据的是全部的样本&#xff0c;当基准回归得到的结果较为显著&#xff0c;即核心解释变量显…

多线程基础入门【Linux之旅】——上篇【线程控制,线程互斥,线程安全】

目录 前文 回望页表 一&#xff0c;什么是线程 二&#xff0c;使用 pthread_create &#xff08;线程创建&#xff09; 三&#xff0c;线程控制 1 &#xff0c;线程共享进程数据&#xff0c;但也拥有自己的一部分数据: 2&#xff0c; 线程 VS 进程优点 3&#xff0c;…

服务器内存介绍

本篇文章用于介绍服务器内存&#xff0c;包括基本概念、内存演进、规格识别、内存条配置规则等 1、基本概念 服务器内存是指安装在服务器主板上的用于存储和处理数据的硬件组件。它是服务器中的主要性能关键因素之一&#xff0c;对于服务器的运行速度、多任务处理能力和数据处…

Linux 进程(九) 进程等待

子进程退出&#xff0c;父进程如果不管不顾&#xff0c;就可能造成‘僵尸进程’的问题&#xff0c;进而造成内存泄漏&#xff0c;所以父进程回收子进程是必然要做的。 另外&#xff0c;进程一旦变成僵尸状态&#xff0c;那就刀枪不入&#xff0c;“杀人不眨眼”的kill …

线性代数笔记6 1.4

学习视频&#xff1a; 2.2 矩阵运算&#xff08;二&#xff09;_哔哩哔哩_bilibili 包括内容&#xff1a; p23 3.2 线性相关线性无关 p24 3.3 向量的秩&#xff08;一&#xff09; p25 3.3 向量的秩&#xff08;二&#xff09; p26 4.1 线性方程组 p27 4.2 线性方程组有解…

一篇文章带你了解基于 Jenkins 流水线方式部署的好处

在软件开发过程中&#xff0c;部署是将代码从开发环境转移到生产环境的关键步骤。传统的部署方式可能涉及多个手动步骤和容易出错的过程。然而&#xff0c;基于 Jenkins 流水线方式部署可以带来许多好处&#xff0c;包括提高效率、一致性和可靠性。本文将探讨基于 Jenkins 流水…

【Spring实战】21 Spring Data REST 常用功能详细介绍

文章目录 1. 资源导出&#xff08;Resource Exporting&#xff09;2. 查询方法&#xff08;Query Methods&#xff09;3. 分页和排序&#xff08;Pagination and Sorting&#xff09;4. 关联关系&#xff08;Associations&#xff09;5. 事件&#xff08;Events&#xff09;6. …

Parallels虚拟机启动后,Mac主机无法上网怎么办

文章目录 1.问题2.解决 1.问题 部分用户在运行Parallels Desktop的Windows 11打开后&#xff0c;Windows上网没有问题 &#xff0c;但是Mac主机不能访问带域名的网站&#xff0c;而访问带ip的网站没问题&#xff0c;退出parallels虚拟机以后&#xff0c;mac网络恢复正常。 2.…

【管理篇 / 恢复】❀ 07. macOS下用命令刷新固件 ❀ FortiGate 防火墙

【简介】随着苹果电脑的普及&#xff0c;很多管理员都会通过苹果电脑对飞塔防火墙进行管理。当防火墙需要命令状态下刷新固件时&#xff0c;在macOS下用命令刷新固件&#xff0c;将会是一个小小的挑战。 首先是硬件的连接&#xff0c;USB配置线的USB一头&#xff0c;接入MAC的U…

【亚马逊云科技】自家的AI助手 - Amazon Q

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

高并发下的计数器实现方式:AtomicLong、LongAdder、LongAccumulator

一、前言 计数器是并发编程中非常常见的一个需求&#xff0c;例如统计网站的访问量、计算某个操作的执行次数等等。在高并发场景下&#xff0c;如何实现一个线程安全的计数器是一个比较有挑战性的问题。本文将介绍几种常用的计数器实现方式&#xff0c;包括AtomicLong、LongAd…