牙叔教程 简单易懂

这种setImageBitmap必须主动回收图片,
bitmap已经赋值给了你定义的变量, 既然你给图片添加了新的引用,
那么这张图片就归你管, 系统就不管了

"ui";
ui.layout(<vertical><img id="img"></img></vertical>
);
let img = images.read(imgPath);
let bitmap = img.bitmap;
ui.img.setImageBitmap(bitmap);
events.on("exit", function () {img.recycle();
});

这种就不用自己主动回收图片,
因为你没有对图片进行引用, 引用是系统自己搞的, 系统可以处理

"ui";
ui.layout(<vertical><img id="img" src="file://{{imgPath}}"></img></vertical>
);

这种也不用自己主动回收图片, 原因同上

ui.layout(<vertical><img id="img"></img></vertical>
);
ui.img.attr("src", "file://" + imgPath);

下面来看看RecyclerView中使用图片的情况
这是使用 img.attr(“src”, “file://” + data.imgPath);
不需要主动回收, 但是滑动rv的时候, 有点卡,
因为每次加载数据, 都去读取一遍图片

ui.layout(<vertical><text text="牙叔教程 简单易懂" textSize="28sp" textColor="#fbfbfe" bg="#00afff" w="*" gravity="center"></text><androidx.recyclerview.widget.RecyclerView id="recyclerView"></androidx.recyclerview.widget.RecyclerView></vertical>
);let imgPath = "/storage/emulated/0/脚本/ui界面图片回收/" + "road.jpg";
let dataList = [];
var len = 33;
for (var i = 0; i < len; i++) {dataList.push({imgPath: imgPath,});
}let recyclerView = ui.recyclerView;
let layoutManager = new LinearLayoutManager(context);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager);
let recycleAdapter = createRecyclerViewAdapter(dataList);
recyclerView.setAdapter(recycleAdapter);
/* ---------------------------自定义函数----------------------------------------------- */
function createRecyclerViewAdapter(dataList) {let boxXml = (<horizontal id="horizontalParent"><text id="num"></text><img id="img"></img></horizontal>);return RecyclerView.Adapter({onCreateViewHolder: function (parent, viewType) {log("onCreateViewHolder");// 视图创建let view;let holder;view = ui.inflate(boxXml, parent, false);holder = JavaAdapter(RecyclerView.ViewHolder, {}, view);return holder;},onBindViewHolder: function (holder, position) {// log("onBindViewHolder");// 数据绑定let data = dataList[position];holder.itemView.num.setText(position + "");holder.itemView.img.attr("src", "file://" + data.imgPath);},getItemCount: function () {return dataList.length;},});
}

我们把onBindViewHolder改写一下, 如果已经加载过一次图片, 就不用执行 **img.attr(“src”**这个命令了,
这属于最简单的缓存吧

onBindViewHolder: function (holder, position) {let data = dataList[position];holder.itemView.num.setText(position + "");if ("file://" + imgPath !== holder.itemView.img.attr("src")) {log("需要读取图片");holder.itemView.img.attr("src", "file://" + data.imgPath);} else {log("不需要读取图片");}
},

修改之后, 除了一开始加载的前几张图片有点卡之外, 其他的一点都不卡, 丝滑的很,

那么问题还是有的, 如何让前几张图片, 滑动的时候, 也不要卡呢?
我们提前读取图片试试, 也就是用setImageBitmap

let imgPath = "/storage/emulated/0/脚本/ui界面图片回收/" + "road.jpg";
let dataList = [];
var len = 33;
let img = images.read(imgPath);
let bitmap = img.bitmap;
for (var i = 0; i < len; i++) {dataList.push({imgPath: imgPath,img: img,bitmap: bitmap,});
}
events.on("exit", function () {img.recycle();
});
ui.layout(<vertical><text text="牙叔教程 简单易懂" textSize="28sp" textColor="#fbfbfe" bg="#00afff" w="*" gravity="center"></text><androidx.recyclerview.widget.RecyclerView id="recyclerView"></androidx.recyclerview.widget.RecyclerView></vertical>
);let recyclerView = ui.recyclerView;
let layoutManager = new LinearLayoutManager(context);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager);
let recycleAdapter = createRecyclerViewAdapter(dataList);
recyclerView.setAdapter(recycleAdapter);
/* ---------------------------自定义函数----------------------------------------------- */
function createRecyclerViewAdapter(dataList) {let boxXml = (<horizontal id="horizontalParent"><text id="num"></text><img id="img"></img></horizontal>);return RecyclerView.Adapter({onCreateViewHolder: function (parent, viewType) {log("onCreateViewHolder");// 视图创建let view;let holder;view = ui.inflate(boxXml, parent, false);holder = JavaAdapter(RecyclerView.ViewHolder, {}, view);return holder;},onBindViewHolder: function (holder, position) {let data = dataList[position];holder.itemView.num.setText(position + "");holder.itemView.img.setImageBitmap(data.bitmap);},getItemCount: function () {return dataList.length;},});
}

试了一下bitmap, 真的很丝滑呢, 起码小米11pro是丝滑的,

我们的dataList有33条数据, 每条数据使用的都是同一张图片的bitmap,
我们来试试33张不同的图片, 看会不会卡顿

修改dataList即可, 注意, bitmap是需要自己主动回收的

let img = images.read(imgPath);
for (var i = 0; i < len; i++) {let newImg = img.clone();let bitmap = newImg.bitmap;dataList.push({imgPath: imgPath,img: newImg,bitmap: bitmap,});
}
events.on("exit", function () {img.recycle();dataList.map(function (item) {item.img.recycle();});
});

基本和使用同一张图片的bitmap效果一样, 感觉不到卡顿.

这就表明, 读取图片是最消耗资源的, 我们尽量少的去读取图片, 尽量早的读取图片,
尤其要在ui中, 减少此类耗时操作, 不然, 卡顿是避免不了的.

现在加载33张图片, 还算可以吧.
如果我们加载3333张图片呢? 我觉得光是提前读取图片就会非常卡了, 非常耗时,
说不定就OOM了(Out Of Memory),
所以在数量级上去之后, 我们是不会提前读取全部图片的,

我们只会读取一小部分图片, 应该叫预加载吧,

手机是支撑不了同一时刻, 加载那么多图片数据的, 一会就卡爆了,
那么我们设定一个阈值, 只在同一时刻保存阈值以内数量的图片数据,

如果有新的图片需要显示, 那么就删掉以前的旧图片, 这个叫

LruCache(Least Recently Used Cache) 全称最近最少使用算法,其主要思想是使用SoftReference(或者WeakReference),因为我们的缓存容量是有限的,它会面临一个问题:当有新的内容需要加入我们的缓存,但我们的缓存空闲的空间不足以放进新的内容时,我们就需要舍弃原有的部分内容从而腾出空间用来放新的内容。

当然了, 写脚本估计用不到几张图片, 这个LurCache了解即可.

环境

手机: Mi 11 Pro
Android版本: 11
Autojs版本: 9.0.11

名人名言

思路是最重要的, 其他的百度, bing, stackoverflow, github, 安卓文档, autojs文档, 最后才是群里问问
— 牙叔教程

声明

部分内容来自网络
本教程仅用于学习, 禁止用于其他用途

bilibili

牙叔教程

微信公众号 牙叔教程

QQ群

747748653

UI界面的图片需要主动回收相关推荐

  1. Qt学习之 在UI界面添加图片

    第一步:添加qrc资源文件 (1)"添加新文件"~~"Qt"~~"Qt Resource File"~~填写文件名 (2)右击刚才新加的文件 ...

  2. UI界面视觉设计之图片和图标

    目录 一.图片 1.图片的位置. ①扩大图片的面积,能产生界面整体的震撼力.如图,放大图片至画面的绝大部分面积,以造成视觉冲击力,营造出良好的视觉. ②在对角线上安置图片要素,如图,可以起到支配整个页 ...

  3. unity ui界面 鼠标变图片移动

    第一步 首先准备1张图(我随便截的)放入unity里,图片转换为Cursor; rso'r 第二步 创建一个Ui界面,在里面创一个按钮: 第三步 创建一个脚本,名字自取(脚本名为TU) sing Sy ...

  4. pc端ui图片尺寸_PC端UI界面设计规范分享 共同来学习_ui设计

    如果你也是从事UI界面设计工作的话,那么,必然会接触到PC端的相关的设计,对于这部分内容,我们必须要掌握住PC端UI界面设计规范的知识,如果你已经准备好的话,下面就让我们一起学习下吧. 1.PC端是什 ...

  5. 图片转素描风格处理软件详解(Python实现,含UI界面及代码)

    摘要:本文主要介绍图片转素描风格的 P y t h o n \color{#4285f4}{P}\color{#ea4335}{y}\color{#fbbc05}{t}\color{#4285f4}{ ...

  6. element ui 图片上传_游民晚播报:PS5手柄续航情况测试 UI界面概览放出

    各位朋友晚上好,现在为您带来今天的晚间播报.一起来回顾一下今天白天游戏圈内外都有哪些要闻.趣闻. 要闻回顾: 1.PS5 DualSense手柄续航情况 触觉反馈密集游戏更耗电 新闻原文:点击查看 P ...

  7. Android(五)——控制UI界面的方法

    文章目录 1. 使用XML布局文件控制UI界面(推荐) 2. 在Java代码中控制UI界面 3. 使用XML和Java代码混合控制UI界面 4. 开发自定义的View 1. 使用XML布局文件控制UI ...

  8. 携程移动端 UI 界面性能优化实践

    UI 卡顿原理和原因 人类大脑与眼睛对一个画面的连贯性感知其实是有一个界限的,譬如我们看电影会觉得画面很自然连贯,其帧率通常为 24fps:那么,用手机当然也需要感知屏幕操作的连贯性(尤其是动画过渡) ...

  9. 基于深度学习的瓶子检测软件(UI界面+YOLOv5+训练数据集)

    摘要:基于深度学习的瓶子检测软件用于自动化瓶子检测与识别,对于各种场景下的塑料瓶.玻璃瓶等进行检测并计数,辅助计算机瓶子生产回收等工序.本文详细介绍深度学习的瓶子检测软件,在介绍算法原理的同时,给出P ...

最新文章

  1. Logical Volume Manager in Linux ( Create, Displ...
  2. TCP三次握手与四次挥手
  3. 以下描述中不属于python语言控制结构的是_高中信息技术《Python语言》模块试卷...
  4. 2019/Province_C_C++_A/F/完全二叉树的权值
  5. Java——类加载机制
  6. IOS开发中--点击imageView上的Button没有任何反应
  7. YbSoftwareFactory 代码生成插件【八】:基于JQuery EasyUI、Web Api的 ASP.NET MVC 代码生成插件...
  8. Car-like Robot运动参数分析
  9. Unity的状态机设计
  10. python html解析对比_python htmlparse页面解析示例
  11. python表情识别程序_python 实现表情识别
  12. Kubernetes 集群安全 - 鉴权 实战rolebinding和clusterrole
  13. 华为云 搭建 Zabbix监控服务
  14. 十五、陈述句_高频扩充
  15. 关于redis的BussinessName取法
  16. aix安装bff_AIX程序打包
  17. Spring官方文档中文翻译
  18. 华为RS入门2基础命令
  19. Webgis 打印实现技术细节
  20. 面试——认识不一样的自己

热门文章

  1. OpenNI2编程说明 (未整理)
  2. vue3中绑定一个点击事件类型出现“{}”上不存在属性问题
  3. # 离散数学#对称和反对称
  4. iPhone判断运营商
  5. Ubuntu引导修复问题
  6. adb查看手机cpu使用率_adb 怎么查看当前cpu使用率
  7. 心法利器[32] | 一些印象深刻的bad case
  8. Linux时间戳timestamp导致端口不通
  9. Tensorrt实现solov2加速
  10. 寄人篱下,却也不卑不亢,为了自己心中的那点情愫付出无数痴心