羽毛球学习 HarmonyOS 设计续篇(24):图片缓存与列表滚动稳定性方案

发布时间:2026/7/25 15:53:30

羽毛球学习 HarmonyOS 设计续篇(24):图片缓存与列表滚动稳定性方案
一、现有边界能显示图片不等于有缓存治理课程、资讯和装备卡片已经能够在网络地址与本地资源之间选择加载失败时也有兜底图。这解决的是“有没有图”还没有回答快速滚动时是否重复下载、解码任务能否取消、内存压力如何控制、同一地址的不同尺寸是否会相互污染。当前设置页中的“清理缓存”主要处理浏览历史也不能作为图片缓存已经落地的证据。因此本文定位为待实施方案。目标不是承诺列表已经达到某个帧率而是建立一套可验收的图片管线列表只请求当前卡片需要的尺寸相同请求只执行一次离屏任务可以取消内存超限时按确定规则淘汰磁盘不可用时仍可退回本地占位图。当前已有仍需设计不纳入本期网络封面地址、本地兜底资源、卡片列表缓存键、预算、并发合并、取消、指标图片编辑、云端 CDN 改造、预下载整套课程页面级刷新和空状态离屏回收与失败可见性预测用户下一次访问二、先定义两级预算再讨论命中率图片缓存不能以“尽量多存”为策略。内存层适合保存已经解码、可直接绘制的小图磁盘层保存压缩后的原始响应两者需要独立预算。建议内存预算取设备可用内存的较小比例并设置硬上限磁盘预算按应用数据规模设定例如 80 MB。收到内存压力通知时内存层应立即缩减到目标水位而不是等待下次启动。export interface ImageBudget { memoryBytes: number diskBytes: number maxParallelRequests: number prefetchDistance: number } export const DEFAULT_IMAGE_BUDGET: ImageBudget { memoryBytes: 24 * 1024 * 1024, diskBytes: 80 * 1024 * 1024, maxParallelRequests: 4, prefetchDistance: 2 } export interface CacheUsage { memoryBytes: number diskBytes: number inFlightCount: number evictionCount: number }预算是稳定性的前提。没有预算时命中率越高可能意味着驻留对象越多最终以卡顿或系统回收结束有了预算命中率、淘汰次数和失败率才有共同解释。三、缓存键必须包含尺寸、裁剪方式和资源版本只用 URL 作为键会产生隐蔽错误列表缩略图可能污染详情页大图圆角裁剪版本也可能复用未经裁剪的结果。建议将标准化地址、目标宽高、缩放方式、主题和版本摘要一起计算为键。服务端若提供 ETag 或 Last-Modified可进入版本摘要没有版本信息时使用带有效期的地址摘要。export interface ImageVariant { widthPx: number heightPx: number fit: cover | contain theme: light | dark revision: string } export function imageCacheKey(url: string, variant: ImageVariant): string { const normalized url.trim().toLowerCase() return [ normalized, variant.widthPx, variant.heightPx, variant.fit, variant.theme, variant.revision ].join(|) }键维度缺失后的风险建议来源宽高与缩放方式小图被放大、重复解码卡片布局规格主题深浅色资源串用当前主题状态版本摘要旧封面长期驻留ETag、更新时间或业务版本四、请求合并、取消与提交必须在协调器中完成列表滚动会让多个卡片在短时间内请求同一图片。协调器先查内存再查磁盘最后才进入网络相同键已有进行中任务时新的订阅者共享 Promise。卡片离屏只取消自己的订阅最后一个订阅者离开才中止底层任务避免一个组件误伤另一个仍可见组件。export type ImageSource memory | disk | network | fallback export interface ImageResult { source: ImageSource pixelMap?: PixelMap errorCode?: string } export interface ImageTicket { key: string result: PromiseImageResult cancel(): void } export interface ImageCoordinator { request(url: string, variant: ImageVariant): ImageTicket trimMemory(level: moderate | critical): void clearDisk(): Promisevoid usage(): CacheUsage }磁盘写入需要先写临时文件、校验长度或摘要再原子替换正式文件。应用被杀或空间不足时临时文件可以在下次启动清理不能把半截文件登记为缓存命中。五、列表单元只消费视觉状态不直接管理网络卡片需要的状态只有占位、加载成功、加载失败和已取消。网络重试、磁盘路径、淘汰顺序不应进入 UI。列表项出现时创建 ticket消失时取消键改变时先取消旧任务再绑定新任务。结果回调还要比较当前键防止旧请求覆盖复用后的卡片。export type CoverVisual | { kind: placeholder } | { kind: ready; pixelMap: PixelMap; source: ImageSource } | { kind: failed; retryable: boolean } export class CoverPresenter { private generation: number 0 async bind(ticket: ImageTicket): PromiseCoverVisual { const current this.generation const result await ticket.result if (current ! this.generation) { return { kind: placeholder } } if (result.pixelMap) { return { kind: ready, pixelMap: result.pixelMap, source: result.source } } return { kind: failed, retryable: result.errorCode ! INVALID_URL } } invalidate(): void { this.generation 1 } }六、失败与降级要对用户无惊扰、对诊断有信号断网时优先显示磁盘副本磁盘无副本则使用本地兜底图。解码失败应删除损坏条目并最多重试一次避免循环。空间不足时暂停磁盘写入但保留受预算约束的内存层。地址非法直接进入不可重试状态。滚动期间不弹连续 Toast错误通过卡片占位和聚合指标表达。失败页面表现后台动作恢复条件断网磁盘副本或兜底图标记网络未命中网络恢复后按需重试文件损坏兜底图删除条目、单次重新下载校验通过空间不足已显示图片保持停止磁盘写入清理后重新开放内存压力可见项保持优先淘汰离屏和低频项水位下降七、取舍稳定优先于激进预取预取距离越大首屏之后的体验可能更顺但会与当前可见请求争夺带宽和解码时间。第一阶段只预取可见窗口之后两项快速滑动时取消低优先级预取。磁盘层采用 LRU 加有效期而内存层采用带成本权重的 LRU尺寸更大的对象成本更高更早进入淘汰候选。建议记录memoryHit、diskHit、networkLoad、decodeFailure、cancelled和visibleReadyLatencyMs。这些指标只用于判断管线是否稳定不在未采集数据前写出命中率或帧率结论。还要避免把缓存命中率当作唯一目标。若为了提高命中率长期保留大尺寸对象解码内存和垃圾回收压力可能反而拉长可见图片的就绪时间。参数校准应同时观察可见延迟、峰值内存、取消比例和网络流量并按低端设备的结果确定默认预算高端设备可以在运行时放宽水位但不能改变键模型和失败合同。八、实施顺序与证据计划第一步落地键模型、内存预算和单元测试第二步增加请求合并与 generation 防串图第三步加入磁盘索引、原子写入和启动清理第四步接入列表生命周期与两项预取第五步再做压力测试和参数校准。验收至少覆盖连续快速滚动 200 个卡片不串图相同键并发只触发一次底层加载卡片离屏后任务可取消损坏文件不会作为命中返回断网有兜底内存压力后用量回落到目标水位清理缓存不删除收藏等用户资产。后续证据应包含性能采样、缓存指标、断网录屏和内存压力日志取得这些证据后才能把文章定位升级为实战。参考HarmonyOS 图片开发指导。九、总结图片缓存不是给Image外面包一层工具类而是一条有预算、有版本、有取消、有原子提交的资源管线。列表稳定性也不能靠“看起来不卡”判断。先把键、任务和降级合同固定再用真实数据校准预算才能让封面加载在快速滚动、弱网和内存压力下保持可解释。

相关新闻

FiPy偏微分方程求解器:Python科学计算的强大有限体积法工具

FiPy偏微分方程求解器:Python科学计算的强大有限体积法工具

2026/7/25 15:53:30

FiPy偏微分方程求解器:Python科学计算的强大有限体积法工具 【免费下载链接】fipy FiPy is a Finite Volume PDE solver written in Python 项目地址: https://gitcode.com/gh_mirrors/fi/fipy 你是否正在寻找一个能够轻松求解复杂偏微分方程的Python工具&am…

隔离栅极驱动器ISO5452:原理、设计与实战应用解析

隔离栅极驱动器ISO5452:原理、设计与实战应用解析

2026/7/25 15:53:30

1. 隔离栅极驱动器:电力电子的“神经与肌肉”接口 在工业电机驱动、光伏逆变器或者大功率UPS的电路板上,你总能找到一类不起眼但至关重要的芯片——隔离栅极驱动器。它就像一位训练有素的“翻译官”和“保镖”,站在微控制器(大脑&…

如何用Mate Engine打造个性化桌面伴侣:5个创新应用场景

如何用Mate Engine打造个性化桌面伴侣:5个创新应用场景

2026/7/25 15:53:30

如何用Mate Engine打造个性化桌面伴侣:5个创新应用场景 【免费下载链接】Mate-Engine A free Desktop Mate alternative with a lightweight interface and custom VRM support, though with more features. 项目地址: https://gitcode.com/gh_mirrors/ma/Mate-En…

Honey Select 2 终极汉化去码补丁:10分钟打造完整游戏体验

Honey Select 2 终极汉化去码补丁:10分钟打造完整游戏体验

2026/7/25 16:43:33

Honey Select 2 终极汉化去码补丁:10分钟打造完整游戏体验 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch HS2-HF Patch是专为Honey Select 2 Libid…

Navicat Premium试用期重置:轻松恢复14天完整试用体验的终极方案

Navicat Premium试用期重置:轻松恢复14天完整试用体验的终极方案

2026/7/25 16:43:33

Navicat Premium试用期重置:轻松恢复14天完整试用体验的终极方案 【免费下载链接】navicat-premium-reset-trial Reset macOS Navicat Premium 15/16/17 app remaining trial days 项目地址: https://gitcode.com/gh_mirrors/na/navicat-premium-reset-trial …

30分钟快速搭建RAG问答系统:FAISS+大模型实战指南

30分钟快速搭建RAG问答系统:FAISS+大模型实战指南

2026/7/25 16:43:33

1. 项目概述:快速搭建RAG问答系统的核心价值去年在处理一个客户的知识库需求时,我深刻体会到传统问答系统的局限性——当用户询问"产品兼容性列表"时,系统要么返回预置的固定回答,要么直接报错。这正是RAG(R…

深入解析TI 18xx异构SoC内存映射与子系统集成设计

深入解析TI 18xx异构SoC内存映射与子系统集成设计

2026/7/25 16:43:33

1. 项目概述与核心价值在嵌入式开发,尤其是汽车雷达、工业控制这类对实时性和可靠性要求极高的领域,选对芯片只是第一步,真正决定项目成败的往往是开发者对芯片内部架构的理解深度。TI的18xx系列芯片,作为集成了Cortex-R4F主控、C…

AFSIM 2.9 源码在麒麟ARM平台编译指南与疑难解析

AFSIM 2.9 源码在麒麟ARM平台编译指南与疑难解析

2026/7/25 16:43:33

1. 项目概述:空天地一体化仿真与AFSIM 如果你从事国防、航空航天、通信或复杂系统仿真领域,那么“空天地一体化仿真”这个概念对你来说一定不陌生。它模拟的是由空中飞行器、空间卫星、地面站以及各类通信链路构成的复杂巨系统,用于评估作战效…

商业数据分析实战:从商业模式到技术落地的完整体系

商业数据分析实战:从商业模式到技术落地的完整体系

2026/7/25 16:33:32

最近在整理商业数据分析的学习资料时,发现很多教程要么过于理论化,要么只讲工具操作,真正能把商业模式、业务系统和分析实战串起来的完整体系少之又少。很多朋友学了一堆Python和SQL,面对真实的业务问题依然无从下手,不知道数据从哪里来、分析什么、如何驱动决策。 本文旨…

微服务进阶:服务网格与Istio

微服务进阶:服务网格与Istio

2026/7/25 6:25:13

541|微服务进阶:服务网格与Istio 上篇文章我们聊了微服务的基本概念和拆分方法。 但微服务多了,问题也多了: 服务之间怎么通信? 怎么监控每个服务的调用链路? 熔断、限流、重试怎么做? 安全认证怎么统一? 以前这些都靠SDK库(比如Hystrix、Feign),每个服务都要集成…

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

2026/7/24 19:29:25

一、零售门店全域协同业务背景与行业痛点 1.1 门店超级终端设备矩阵(连锁便利店/商超标准配置) 自助收银Kiosk一体机:顾客结算、自助核销优惠券、商品素材预览;运营折叠平板:店长后台商品上新、图片录入、活动配置、…

噗叽短视频界面分析

噗叽短视频界面分析

2026/7/25 9:26:35

1 和小红书类似,可以采用类似判断方法------------其实他比小红书好判断,因为他没有图片,控件位置几乎是固定的,都不用判断------------2 因为他没有点赞按钮------------而且几乎所有控件位置都是完全一样的,所以我就…

挑战一天速通Spring全家桶!

挑战一天速通Spring全家桶!

2026/7/25 0:02:22

不知道各位Java好大哥们闲的时候会不会去关注Spring目前的官网,你会发现他的slogan是: Spring makes Java Simple。它让Java的开发变得更加简单。某种意义上来说:是Spring成就了Java!但随之而来的就是:由他之后诞生出来的各种组件…

挑战一天速通Java高并发!

挑战一天速通Java高并发!

2026/7/25 0:02:22

有出去面试的朋友肯定深有感受,像我们刚入行那会面试的加分项现在卷得已经成为了面试的基础题(手动狗头)。其中最典型的就属这个Java并发编程了。之前一般只有大厂才会有高并发编程相关的面试内容,但现在只要你入了Java行业就会涉…

从暴雪到米哈游都在用的平衡性评估框架,深度拆解LSTM+胜率归因分析法(附开源工具链)

从暴雪到米哈游都在用的平衡性评估框架,深度拆解LSTM+胜率归因分析法(附开源工具链)

2026/7/25 0:02:22

更多请点击: https://kaifayun.com 第一章:AI 游戏平衡性分析 现代游戏开发中,AI 不再仅用于控制 NPC 行为,更被深度整合进游戏平衡性调优流程。通过强化学习与对抗性仿真,AI 可以在数百万局对局中自动识别数值失衡点…