智能网络感知,打造极致流畅的鸿蒙原生版中国移动云盘图文体验

背景

中国移动云盘(原“和彩云网盘”)是中国移动重磅推出的安全、智能、不限速、移动用户免流的智能云盘,致力于成为5G时代用户个人与家庭的数字资产管理中心,是中国移动继语音、短信、流量后的“第四项基础服务”。

照片、音视频的备份和使用是市面上所有网盘用户的重点体验场景,用户将照片等资源备份到云盘,以节省本地资源存储。批量的图片、音视频缩略图加载,有时因网络原因出现加载缓慢等异常。中国移动云盘技术团队,致力于实现极致流畅的图文加载体验持续优化。

解决方案

以中国移动云盘鸿蒙原生版为例,借助华为Remote Communication Kit提供的智能网络感知服务,中国移动云盘通过三个步骤,提升了用户使用云盘时的加载体验,为用户提供更丝滑的云盘服务。

步骤一:动态预加载机制

以中国移动云盘的相册为例,当用户打开相册时,图文加载区域分为预加载区域、预渲染区域以及可见区域。

首先,智能网络感知服务帮助中国移动云盘优先保证用户可见区域的加载完成,并跟随屏幕滑动动态调整预加载区域,同时通过本地文件缓存替代实时加载的形式,在屏幕滑动时大大降低了图片白块概率;再通过减少预渲染区域预加载的图片数量,降低UI渲染带来的CPU负载开销。

步骤二:动态取消加载机制

当用户快速滑动屏幕时,有时候有的资源已经滑出了屏幕,但网络请求还未到达。中国移动云盘基于智能网络感知服务的网络请求可取消机制,在用户快速滑动时,将滑过屏幕的资源取消加载,降低网络负载。

步骤三:智能网络感知下动态调控预加载区域机制

基于RCP的网络耗时统计能力,可以计算出每个资源请求的平均耗时,感知网络质量并智能调整预加载区域。在网络质量好时,增大预加载区域,网络质量差时,就降低预加载区域。

成果展示

最终,通过中国移动云盘专家与华为网络通信专家联合构建图文资源动态加载,实现了鸿蒙原生版中国移动云盘网络资源如本地资源一样的流畅加载体验。
优化前:有时因网络原因出现加载占位图和加载过程动画。

优化后:随意滑动,图文内容加载非常流畅自然。

在这里插入图片描述

开发指南

1、下载并安装:
ohpm install @netteam/prefetcher

有关 OpenHarmony ohpm 环境配置的更多信息,请参阅如何安装 OpenHarmony ohpm 包。

2、集成预取器:

在深入探讨细节之前,需要提及两点。

1.预取程序驱动用户代码获取所显示集合中的项目所引用的资源。换句话说,用户代码获取 URL 存储在集合项目中的图像。

2.有两种使用 Prefetcher API 的方法。第一种方法假设保存项目的数据源实现了两种附加方法:prefetch()和cancel() IDataSourcePrefetching。第二种方法(稍后介绍)使用用户注册的回调来执行相同的任务。方法的选择由用户决定,但“基于回调”的方法比“基于预取数据源”的方法更具优势:

更容易组织工作线程上的提取。

支持以数组形式呈现的集合,并因此支持Repeat组件。

通过遵循单一责任原则来更好地组织应用程序代码,因为数据源不负责执行获取。

3、使用“基于预取数据源”的方法

以下是Prefetcher 演示存储库中示例应用程序之一的详细代码片段。该应用程序演示了预取器库的使用。演示应用程序包含大量图像。每幅图像都是在应用程序内合成的彩色矩形。获取操作在主应用程序线程上执行。

import { BasicPrefetcher, IDataSourcePrefetching } from '@netteam/prefetcher';
import { image } from '@kit.ImageKit';
import { create10x10Bitmap, getRandomColor } from 'examples_common'; // Code of these functions is omitted for brevityconst ITEMS_ON_SCREEN = 8;@Component
export struct PrefetcherDemoComponent {private readonly dataSource = new SimulationDataSource(2000, 500);private readonly prefetcher = new BasicPrefetcher(this.dataSource);build() {Column() {List() {LazyForEach(this.dataSource, (item: PictureItem) => {ListItem() {PictureItemComponent({ info: item }).height(`${100 / ITEMS_ON_SCREEN}%`)}}, (item: PictureItem) => item.title)}.onScrollIndex((start: number, end: number) => {this.prefetcher.visibleAreaChanged(start, end);})}}
}@Component
export default struct PictureItemComponent {@ObjectLink info: PictureItem;build() {Row() {Image(this.info.imagePixelMap).objectFit(ImageFit.Contain).width('40%')Text(this.info.title).width('60%')}}
}@Observed
export class PictureItem {readonly color: number;title: string;imagePixelMap: image.PixelMap | undefined;key: string;constructor(color: number, title: string) {this.color = color;this.title = title;this.key = title;}
}type ItemIndex = number;
type TimerId = number;class SimulationDataSource implements IDataSourcePrefetching {private readonly items: PictureItem[];private readonly fetchDelayMs: number;private readonly fetches: Map<ItemIndex, TimerId> = new Map();constructor(numItems: number, fetchDelayMs: number) {this.items = [];this.fetchDelayMs = fetchDelayMs;for (let i = 0; i < numItems; i++) {const item = new PictureItem(getRandomColor(), `Item ${i}`);this.items.push(item);}}async prefetch(index: number): Promise<void> {const item = this.items[index];if (item.imagePixelMap) {return;}// Simulate long running operationreturn new Promise<void>(resolve => {const timeoutId = setTimeout(async () => {this.fetches.delete(index);const bitmap = create10x10Bitmap(item.color);const imageSource: image.ImageSource = image.createImageSource(bitmap);item.imagePixelMap = await imageSource.createPixelMap();resolve();}, this.fetchDelayMs);this.fetches.set(index, timeoutId);});}cancel(index: number): void {const timerId = this.fetches.get(index);if (timerId) {this.fetches.delete(index);clearTimeout(timerId);}}totalCount(): number {return this.items.length;}getData(index: number): PictureItem {return this.items[index];}registerDataChangeListener(_: DataChangeListener): void {}unregisterDataChangeListener(_: DataChangeListener): void {}
}

该类PictureItem表示引用需要“下载”才能呈现给用户的数据的项目。获取后,它将获得Image组件的像素图。

是SimulationDataSource与预取器和组件链接的数据源LazyForEach。其单个参数指定列表大小。它负责执行获取操作并模拟获取图像,并附加延迟,可在其构造函数中设置。延迟以毫秒为单位指定。

一旦图片准备好,就会包装每个并允许显示图像PictureItemComponent。PictureItem

探索更多

Remote Communication Kit是HarmonyOS系统提供对HTTP发起数据请求的NAPI封装,通过@hms.collaboration.rcp(简称rcp)模块将相关能力开放给开发者,为开发者提供基于rcp的文件上传与下载的开发实践。

访问Remote Communication Kit华为开发者联盟官网,以及开发者方案示例,了解更多详情开始使用。

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

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

相关文章

Windows 11【1001问】Windows 11系统硬件配置要求

Windows 11 的设计目标是让用户更贴近自己喜欢的内容&#xff0c;在其发布之际&#xff0c;计算机在连接、创作以及游戏体验方面扮演了更加核心的角色。在设定 Windows 11 的最低系统要求时&#xff0c;我们依据三个关键原则来指导决策&#xff0c;以确保用户能够获得卓越的使用…

SQL笔记#函数、谓词、CASE表达式

目录 一、各种各样的函数 1、函数的种类 2、算术函数 ABS——绝对值 MOD——取余 ROUND——四舍五入 3、字符串函数 ||——拼接 LENGTH——字符串长度 LOWER——小写转换 REPLACE——字符串的替换 SUBSTR——字符串的截取 UPPER——大写转换 4、日期函数 CURRENT_DATE——…

为人工智能驱动的交通研究增强路面传感器数据采集

论文标题 英文标题&#xff1a;Enhancing Pavement Sensor Data Harvesting for AI-Driven Transportation Studies 中文标题&#xff1a;为人工智能驱动的交通研究增强路面传感器数据采集 作者信息 Manish Kumar Krishne Gowda Purdue University, 465 Northwestern Avenue,…

简讯:Rust 2024 edition and v1.85.0 已发布

详见 https://blog.rust-lang.org/2025/02/20/Rust-1.85.0.html 升级方法&#xff1a;rustup update stable

clickhouse-介绍、安装、数据类型、sql

1、介绍 ClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库&#xff08;DBMS&#xff09;&#xff0c;使用C语言编写&#xff0c;主要用于在线分析处理查询&#xff08;OLAP&#xff09;&#xff0c;能够使用SQL查询实时生成分析数据报告。 OLAP&#xff08;On-Line A…

pycharm技巧--鼠标滚轮放大或缩小 Pycharm 字体大小

1、鼠标滚轮调整字体 设置 Ctrl 鼠标滚轮调整字体大小 备注&#xff1a; 第一个是活动窗口&#xff0c;即缩放当前窗口 第二个是所有编辑器窗口&#xff0c;即缩放所有窗口的字体 2、插件 汉化包&#xff1a; Chinese Simplified 包

R语言安装教程(附安装包)R语言4.3.2版本安装教程

文章目录 前言一、安装包下载二、R-4.3.2安装步骤三、rtools43安装步骤四、RStudio安装步骤 前言 本教程将详细、全面地为你介绍在 Windows 系统下安装 R 语言 4.3.2 的具体步骤。无论你是初涉数据领域的新手&#xff0c;还是希望更新知识体系的专业人士&#xff0c;只要按照本…

从零开始玩转TensorFlow:小明的机器学习故事 5

图像识别的挑战 1 故事引入&#xff1a;小明的“图像识别”大赛 小明从学校里听说了一个有趣的比赛&#xff1a;“美食图像识别”。参赛者需要训练计算机&#xff0c;看一张食物照片&#xff08;例如披萨、苹果、汉堡等&#xff09;&#xff0c;就能猜出这是什么食物。听起来…

01 冲突域和广播域的划分

目录 1、冲突域和广播域的划分 1.1、冲突域 1.2、广播域 1.3、对比总结 1.4、冲突域与广播域个数计算例题 2、交换机和路由器的结构 2.1、交换机的结构 2.2、路由器的结构 1、冲突域和广播域的划分 1.1、冲突域 冲突域是指网络中可能发生数据帧冲突的物理范围。当多…

[C++]使用纯opencv部署yolov12目标检测onnx模型

yolov12官方框架&#xff1a;sunsmarterjie/yolov12 【算法介绍】 在C中使用纯OpenCV部署YOLOv12进行目标检测是一项具有挑战性的任务&#xff0c;因为YOLOv12通常是用PyTorch等深度学习框架实现的&#xff0c;而OpenCV本身并不直接支持加载和运行PyTorch模型。然而&#xff…

神经网络八股(3)

1.什么是梯度消失和梯度爆炸 梯度消失是指梯度在反向传播的过程中逐渐变小&#xff0c;最终趋近于零&#xff0c;这会导致靠前层的神经网络层权重参数更新缓慢&#xff0c;甚至不更新&#xff0c;学习不到有用的特征。 梯度爆炸是指梯度在方向传播过程中逐渐变大&#xff0c;…

zyNo.26

[GXYCTF2019]Ping Ping Ping&#xff08;Web&#xff09; 传/&#xff1f;ip1有ping回显&#xff0c;说明后端可能通过php参数接受了ip参数&#xff0c;并且拼接到了最终执行的命令里形成了ping -c 3$ip&#xff0c;这样可能存在一个命令注入漏洞 要判断是否符合 ping -c 3$ip …

轻量级SDK,大能量:EasyRTC重塑嵌入式设备音视频体验

在智能硬件与物联网迅猛发展的今天&#xff0c;嵌入式设备的音视频通讯能力正变得愈加关键。然而&#xff0c;受限于硬件资源&#xff0c;尤其是Flash存储空间的不足&#xff0c;传统的音视频通讯方案往往难以在嵌入式设备上实现高效集成。EasyRTC凭借其轻量级SDK和先进的技术架…

算法日常刷题笔记(2)

为保持刷题的习惯 计划一天刷3-5题 然后一周总计汇总一下 这是第二篇笔记 笔记时间为2月17日到2月23日 第一天 找到初始输入字符串 找到初始输入字符串 Ihttps://leetcode.cn/problems/find-the-original-typed-string-i/ Alice 正在她的电脑上输入一个字符串。但是她打字技…

[实现Rpc] 客户端 | Requestor | RpcCaller的设计实现

目录 Requestor类的实现 框架 完善 onResponse处理回复 完整代码 RpcCaller类的实现 1. 同步调用 call 2. 异步调用 call 3. 回调调用 call Requestor类的实现 &#xff08;1&#xff09;主要功能&#xff1a; 客户端发送请求的功能&#xff0c;进行请求描述对服务器…

WPS计算机二级•文档的页面设置与打印

听说这是目录哦 纸张大小页边距和装订线❤️‍&#x1f525;打印界面讲解❤️缩印&#x1f495;打印作文稿纸&#x1f49e;将文档打印成书籍&#x1f493;限制编辑设置&#x1f497;给文字文档加密&#x1f496;文档导出为 PDF格式&#x1f498;协作编辑模式&#x1f49d;能量站…

hackmyvm-buster

题目地址 信息收集 主机发现 ┌──(root㉿kali)-[/home/kali] └─# arp-scan -I eth1 192.168.56.0/24 Interface: eth1, type: EN10MB, MAC: 00:0c:29:34:da:f5, IPv4: 192.168.56.103 WARNING: Cannot open MAC/Vendor file ieee-oui.txt: Permission denied WARNING: C…

【入门音视频】音视频基础知识

&#x1f308;前言&#x1f308; 这个系列在我学习过程中&#xff0c;对音视频知识归纳总结的笔记。因为音视频相关讲解非常稀少&#xff0c;所以我希望通过这个音视频系列&#xff0c;跟大家一起学习音视频&#xff0c;希望减少初学者在学习上的压力。同时希望也欢迎指出文章的…

将Ubuntu操作系统的安装源设置为阿里云

在使用Ubuntu操作系统时,默认的软件源通常是国外的仓库,这可能会导致软件安装和更新速度较慢。为了提高下载速度和稳定性,我们可以将Ubuntu的安装源设置为阿里云镜像源。以下是详细步骤: 一、准备工作 在开始之前,请确保您的Ubuntu系统可以正常上网,并且您拥有管理员权…

基于 Python 的项目管理系统开发

基于 Python 的项目管理系统开发 一、引言 在当今快节奏的工作环境中&#xff0c;有效的项目管理对于项目的成功至关重要。借助信息技术手段开发项目管理系统&#xff0c;能够显著提升项目管理的效率和质量。Python 作为一种功能强大、易于学习且具有丰富库支持的编程语言&…