Android imageView.setImageXXX() 引发的卡顿问题

在 Android 开发中,ImageView 是一个用户界面控件,用于在应用中显示图片。它是 Android UI 组件库中一个非常基础和常用的部分。使用 ImageView,你可以在屏幕上显示来自不同来源的图像,比如位图文件、绘图资源 drawable、网络来源或者相机拍摄的图片。

在实际的开发过程中,我们会在 Java 或 Kotlin 代码中调用 setImageResource()、setImageBitmap()、setImageDrawable() 等方法来设置或改变图片。

但我最近在检测应用的性能时,发现 imageView 在加载图片竟有一些耗时,于是进入源码来看看这几个给 imageView 设置图片的方法都有什么区别


imageView.setImageResource():

    public void setImageResource(@DrawableRes int resId) {final int oldWidth = mDrawableWidth;final int oldHeight = mDrawableHeight;updateDrawable(null);mResource = resId;mUri = null;resolveUri();if (oldWidth != mDrawableWidth || oldHeight != mDrawableHeight) {requestLayout();}invalidate();}

在 setImageResource 方法中,首先 updateDrawable() 做了重置操作,后面给成员变量 mResource 赋值,接着执行 resolveUri() 这个方法对 mResource 进行解析

    private void resolveUri() {Drawable d = null;if (mResource != 0) {try {// 根据传进来的资源ID去获取对应的Drawable(耗时)d = mContext.getDrawable(mResource); } catch (Exception e) {// Don't try again.mResource = 0;}} else if (mUri != null) {d = getDrawableFromUri(mUri);if (d == null) {// Don't try again.mUri = null;}} else {return;}updateDrawable(d);}

resolveUri() 方法中会将刚刚传进来的 mResource 去获取对应的 Drawable,获取到 Drawble 后通过调用 updateDrawable() 来更新 imageView 中的图像


imageView.setImageBitmap():

    public void setImageBitmap(Bitmap bm) {mDrawable = null;if (mRecycleableBitmapDrawable == null) {mRecycleableBitmapDrawable = new BitmapDrawable(mContext.getResources(), bm);} else {mRecycleableBitmapDrawable.setBitmap(bm);}setImageDrawable(mRecycleableBitmapDrawable);}

setImageBitmap 代码非常少,首先确定有一个 BitmapDrawable 对象,将传进来的 Bitmap 赋值于此,然后调用 setImageDrawable() 方法


imageView.setImageDrawable():

    public void setImageDrawable(@Nullable Drawable drawable) {if (mDrawable != drawable) {mResource = 0;mUri = null;final int oldWidth = mDrawableWidth;final int oldHeight = mDrawableHeight;updateDrawable(drawable);if (oldWidth != mDrawableWidth || oldHeight != mDrawableHeight) {requestLayout();}invalidate();}}

在 setImageDrawable 方法中,直接将传进来的 Drawable 来调用 updateDrawable() 方法来更新imageView() 中的图像


总结:
用这三种方法去更新 imageView 最终都会调用到 updateDrawable() 这个方法,但是在 setImageResource() 中的 resolveUri() 方法涉及到了资源获取:mContext.getDrawable(),这个是耗时的,所以在短时间内调用大量的 setImageResource 可能会造成应用卡顿。

解决方法:
将资源 ID 获取到的 Drawable 进行缓存或者设置为成员变量,再调用 setImageDrawable() 即可。这样子能避免资源获取而造成的卡顿。


此外,ImageView 还提供了其他方法,如 setImageURI(Uri uri),用于通过 URI 设置图像,但无论哪种设置图像的方法,最终都是通过 Drawable 来实现图像的渲染。所以在短时间内大量设置imageView 图像时,需要优先缓存 Drawable 来加载图像来保证性能是最佳的

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

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

相关文章

NPDP认证:产品经理的国际专业认证

你是否想证明自己在产品开发与管理方面的专业能力?NPDP认证正是你需要的!🔥 NPDP认证,即产品经理国际资格认证,由美国产品开发与管理协会(PDMA)所发起,是全球公认的新产品开发专业认…

Redis(九)集群(cluster)

文章目录 概述作用1. redis集群的槽位slot2. redis集群的分片3. 第1,2点的优势:**最大优势,方便扩缩容和数据分派查找**4. slot槽位映射,一般业界有3种解决方案第一种:哈希取余分区第二种:一致性哈希算法分区第三种&am…

源码安装nginx并提供服务脚本

一、下载nginx ①官网复制下载链接 ②在Linux中下载 [rootopenEuler2 ~]# wget -c https://nginx.org/download/nginx-1.24.0.tar.gz 二、解压并指定路径 [rootopenEuler2 ~]# tar xf nginx-1.24.0.tar.gz -C /usr/local/src/ 三、安装依赖 dnf install -y gcc gcc-c mak…

微信小程序从入门到进阶(三)

数据监听器 通过observers声明数据监听器 使用场景&#xff1a;1、需要监听数据的变化 2、在数据变化之后&#xff0c;进行一些操作的时候 <view wx:for"{{ listData }}" wx:key"index" class"tab {{ active index ? active : }}" bind…

蓝桥杯练习题-图书ISBN号码

题目&#xff1a;每—本正式出版的图书都有一个ISBN号码与之对应&#xff0c;ISBN码包括9位数字、1位识别码和3位分隔符&#xff0c;其规定格式如“x-xXX-XXXxx-x”&#xff0c;其中符号"-"是分隔符(键盘上的减号)&#xff0c;最后—位是识别码&#xff0c;例如O-670…

【Cesium】在着色器中计算片元的高程

问题提出 有时候在 Cesium 上做一些效果时&#xff0c;需要知道片元的高程。而渲染是基于笛卡尔坐标的&#xff0c;没有高程这个概念。怎么在着色器中计算片元的高程呢&#xff1f; 基本思路 通常做法是在着色器里对深度纹理采样&#xff0c;将片元的深度值转换为相机坐标。…

一片带你熟练Git分支管理

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1.理解分支2.创建分支…

如何快速记忆小鹤双拼键位图?

记忆方法&#xff1a;韵母表 图形 最常用字 韵母表&#xff1a;双拼的基础 图形&#xff1a;帮助新手快速联想回忆 最常用字&#xff1a;快速打字基础 一、单韵母&#xff08;紫色方块&#xff09; 一一对应如下表&#xff1a; 单韵母aoeiu、AOEIV 二、复韵母—箭矢型&am…

javaScript删除对象属性总结方法

在JavaScript中&#xff0c;可以使用以下几种方法来删除对象的属性&#xff1a; 1、使用delete关键字 使用delete关键字可以从对象中删除指定的属性。示例代码如下&#xff1a; var obj {name: "John",age: 30,city: "New York" };console.log(obj); /…

几种常见编码器优缺点

目录 光电编码器 磁性编码器 编码器在运动控制类产品中比较常见&#xff0c;旋转编码器都是组成运动控制反馈回路的关键元器件&#xff0c;包括工业自动化设备和过程控制、机器人技术、医疗设备、能源、航空航天等。 作为将机械运动转换为电信号的器件&#xff0c;编码器可为…

ASP.NET Core 使用 SignalR 的简单示例

写在前面 ASP.NET SignalR 是一个开源代码库&#xff0c;简化了Web实时通讯方案&#xff0c;可以实时地通过服务端将信息同步推送到各个客户端&#xff0c;可应用于 需要从服务器进行高频更新的应用&#xff1a;包括游戏、社交网络、投票、拍卖、地图和GPS应用&#xff1b; 仪…

Linux命令-aptitude命令(Debian Linux系统中软件包管理工具)

补充说明 aptitude命令 与apt-get命令一样&#xff0c;都是Debian Linux及其衍生系统中功能极其强大的包管理工 具。与apt-get不同的是&#xff0c;aptitude在处理依赖问题上更佳一些。举例来说&#xff0c;aptitude在删除一个 包时&#xff0c;会同时删除本身所依赖的包。这样…

excel中去掉单元格中两个数字之间的空格

excel中去掉单元格中两个数字之间的空格 使用公式&#xff1a;SUBSTITUTE(A1," “,”") 解释&#xff1a;将A1单元格中的空格查找出来并去掉。

python_蓝桥杯刷题记录_笔记_入门2

前言 现在正式进入蓝桥杯的刷题啦&#xff0c;用python来做算法题&#xff0c;因为我之前其实都是用C来做题的&#xff0c;但是今年的话我打算换python来试试&#xff0c;很明显因为也才这学期接触python 加上之前C做题也比较菜&#xff0c;所以我打算用python重新来做题&#…

Nginx 部署指定文件夹下的项目(本地测试)

1、配置 vue.config.js&#xff0c;指定生成环境的包 //部署生产环境和开发环境下的URLpublicPath: process.env.NODE_ENV production ? "/marketing" : "/",///npm run build 或 varn build 生成文件的日录名称(要利baseUrl的牛产环境路一致)(默认dist…

STL之stack 【栈】

STL之stack 【栈】 头文件创建stack添加元素(插入元素)删除元素&#xff08;弹出元素&#xff09;访问元素检查栈是否为空&#xff1a;获取栈的大小遍历C中stack用c语言实现栈 stack&#xff1a;栈&#xff0c;后进先出&#xff08;LIFO&#xff09;的数据结构。适用于需要在容…

每日一言正能量句子,心灵鸡汤之励志文案

1、相信自我是成功的基石&#xff0c;完善自我是成功的阶梯&#xff0c;突破自我是成功的钥匙&#xff0c;合谋共处是成功的翅膀&#xff0c;确立目标是成功的起点&#xff0c;付注行动是成功的号角&#xff01; 2、所有的努力&#xff0c;不是为了让别人觉得你了不起&#xf…

Modern C++ sizeof(std::tuple)的秘密

1. 前言 我们曾经至少三篇帖子或多或少的提到过std::tuple的原理及占用空间大小: Modern C++ std::tuple的sizeModern C++利用工具快速理解std::tuple的实现原理GDB调试技巧实战–自动化画出类关系图Modern C++ std::unique_ptr的实现原理但是,当初在第一篇中提出的size的问…

【INTEL(ALTERA)】错误:*.onchip_flash_0:UFM 扇区不支持“隐藏”模式。请更新访问模式设置

说明 由于英特尔 Quartus Prime Standard Edition 软件版本 22.1 存在一个问题&#xff0c;当您针对 10 FPGA Compact 变体英特尔 MAX在片上闪存英特尔 FPGA IP中选择单压缩映像配置模式时&#xff0c;可能会出现以下错误消息。 错误&#xff1a;*.onchip_flash_0&#xff1a…

C系列-自定义类型:结构体

&#x1f308;个人主页: 会编程的果子君 ​&#x1f4ab;个人格言:“成为自己未来的主人~” 结构体类型的声明 前面我们在学习操作符的时候&#xff0c;已经学习了结构体的知识&#xff0c;这里我们稍微复习一下。 结构体回顾 结构是一些值的集合&#xff0c;这些值称为成员…