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

背景

中国移动云盘(原“和彩云网盘”)是中国移动重磅推出的安全、智能、不限速、移动用户免流的智能云盘,致力于成为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 brevity

const 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 operation
    return 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华为开发者联盟官网,以及开发者方案示例,了解更多详情开始使用。

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

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

相关文章

Windows 快速搭建C++开发环境,安装C++、CMake、QT、Visual Studio、Setup Factory

安装C 简介 Windows 版的 GCC 有三个选择&#xff1a; CygwinMinGWmingw-w64 Cygwin、MinGW 和 mingw-w64 都是在 Windows 操作系统上运行的工具集&#xff0c;用于在 Windows 环境下进行开发和编译。 Cygwin 是一个在 Windows 上运行的开源项目&#xff0c;旨在提供类Uni…

VS Code 如何搭建C/C++开发环境

目录 1.VS Code是什么 2. VS Code的下载和安装 2.1 下载和安装 2.2.1 下载 2.2.2 安装 2.2 环境的介绍 2.3 安装中文插件 3. VS Code配置C/C开发环境 3.1 下载和配置MinGW-w64编译器套件 3.1.1 下载 3.1.2 配置 3.2 安装C/C插件 3.3 重启VSCode 4. 在VSCode上编写…

2024年国赛高教杯数学建模A题板凳龙闹元宵解题全过程文档及程序

2024年国赛高教杯数学建模 A题 板凳龙闹元宵 原题再现 “板凳龙”&#xff0c;又称“盘龙”&#xff0c;是浙闽地区的传统地方民俗文化活动。人们将少则几十条&#xff0c;多则上百条的板凳首尾相连&#xff0c;形成蜿蜒曲折的板凳龙。盘龙时&#xff0c;龙头在前领头&#x…

详解同为科技桌面PDU系列产品特点

同为科技的桌面PDU系列产品是依据自身在电气联接领域25年专业积累并精心设计&#xff0c;产品采用模块化结构&#xff0c;实现各种功能、输出插口、输入方式可根据用户需求以模块组合的方式构建定制化产品。 桌面PDU产品特点 工业级材质和结构设计 桌面PDU系列产品采用一体成…

【排版教程】如何在Word/WPS中优雅的插入参考文献

材料展示 随便选取一段综述内容&#xff0c;以及对应的参考文献&#xff0c;如下图所示&#xff1a; 1 参考文献编辑 首先对参考文献部分进行编辑&#xff0c;将其设置自动编号 在段落中&#xff0c;选择悬挂缩进 在编号中&#xff0c;设置自定义编号&#xff0c;然后按照…

STM32 看门狗

目录 背景 独立看门狗&#xff08;IWDG&#xff09; 寄存器访问保护 窗口看门狗&#xff08;WWDG&#xff09; 程序 独立看门狗 设置独立看门狗程序 第一步、使能对独立看门狗寄存器的写操作 第二步、设置预分频和重装载值 第三步、喂狗 第四步、使能独立看门狗 喂狗…

【第二节】C++设计模式(创建型模式)-抽象工厂模式

目录 引言 一、抽象工厂模式概述 二、抽象工厂模式的应用 三、抽象工厂模式的适用场景 四、抽象工厂模式的优缺点 五、总结 引言 抽象工厂设计模式是一种创建型设计模式&#xff0c;旨在解决一系列相互依赖对象的创建问题。它与工厂方法模式密切相关&#xff0c;但在应用…

docker基操

docker基操 首先就是安装docker使用docker:创建容器-制作一个镜像-加载镜像首先就是安装docker 随便找一个教程安装就可以,安装过程中主要是不能访问谷歌,下面这篇文章写了镜像的一些问题: 安装docker的网络问题 使用docker:创建容器-制作一个镜像-加载镜像 主要是参考:这篇…

3D打印注塑件-省模具费90%的解决方案

"开模费用50万&#xff0c;首批订单才200件&#xff1f;" 这是许多制造企业的真实困境。传统注塑工艺动辄数周的开模周期和5-50万元的模具成本&#xff0c;让中小企业的产品迭代举步维艰。 在传统制造流程中&#xff0c;注塑件的生产往往需要高昂的模具开发费用和较…

Java+SpringBoot+Vue+数据可视化的综合健身管理平台(程序+论文+讲解+安装+调试+售后)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 在当今社会&#xff0c;随着人们生活水平的不断提高和健康意识的日益增强&#xff0c;健…

美的楼宇科技基于阿里云 EMR Serverless Spark 构建 LakeHouse 湖仓数据平台

作者&#xff1a;美的楼宇科技事业部 先行研究中心智能技术部 美的楼宇科技 IoT 数据平台建设背景 美的楼宇科技事业部&#xff08;以下简称楼宇科技&#xff09;是美的集团旗下五大板块之一&#xff0c;产品覆盖多联机组、大型冷水机组、单元机、机房空调、扶梯、直梯、货梯…

matlab 车辆进出检测算法设计GUI界面-论文

1、内容简介 matlab151-车辆进出检测算法设计GUI界面-论文 可以交流、咨询、答疑 2、内容说明 略 随着科学技术的进步&#xff0c;社会的发展&#xff0c;各行各业都在发生着巨大的变化。近段时间以来&#xff0c;“无人化”智能产业正处于一个风口阶段&#xff0c;似乎我们…

python学习书籍推荐

### Python 学习路线图概述 为了有效地掌握Python这门编程语言并应用于不同领域&#xff0c;构建一个合理的学习路径至关重要。此学习路径不仅涵盖了基础语法&#xff0c;还深入到特定应用方向的关键技术。 #### 基础阶段 在这个初始阶段&#xff0c;重点在于理解Python的基…

基于Spring Boot的农事管理系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

在 Ansys Motion 中创建链式伸缩臂的分步指南

介绍 链传动在负载和/或运动要远距离传递的机器中非常多产&#xff0c;例如&#xff0c;在两个平行轴之间。链条驱动系统的设计需要了解载荷传递和运动学如何影响链条张力、轴轴承中的悬臂载荷、轴应力和运动质量等。使用 Ansys Motion&#xff0c;可以轻松回答上述所有问题以…

Web Scraper,强大的浏览器爬虫插件!

Web Scraper是一款功能丰富的浏览器扩展爬虫工具&#xff0c;有着直观的图形界面&#xff0c;无需编写代码即可自定义数据抓取规则&#xff0c;高效地从网页中提取结构化数据&#xff0c;而且它支持灵活的数据导出选项&#xff0c;广泛应用于电商监控、内容聚合、市场调研等多元…

数据结构:栈和队列详解(下)

目录 一.如何用队列实现栈 1.思路&#xff1a; 2.具体代码&#xff1a; 二.如何用栈实现队列 1.思路&#xff1a; 2.具体代码&#xff1a; 一.如何用队列实现栈 原题来源&#xff1a;https://leetcode.cn/problems/implement-stack-using-queues/description/ 前言&#xf…

DeepSeek智能测试知识库助手PRO版:多格式支持+性能优化

前言 测试工程师在管理测试资产时,需要面对多种文档格式、大量文件分类及知识库的构建任务。为了解决这些问题,我们升级了 DeepSeek智能测试知识库助手,不仅支持更多文档格式,还加入了 多线程并发处理 和 可扩展格式支持,大幅提升处理性能和灵活性。 主要功能亮点: 多格…

宝塔面板开始ssl后,使用域名访问不了后台管理

宝塔面板后台开启ssl访问后&#xff0c;用的证书是其他第三方颁发的证书 再使用 域名/xxx 的形式&#xff1a;https://域名:xxx/xxx 访问后台&#xff0c;结果出现如下&#xff0c;不管使用 http 还是 https 的路径访问都进不后台管理 这个时候可以使用 https://ip/xxx 的方式来…

机器学习_12 逻辑回归知识点总结

逻辑回归是机器学习中一种重要的分类算法&#xff0c;广泛应用于二分类和多分类问题。它不仅能够预测分类结果&#xff0c;还能提供每个类别的概率估计。今天&#xff0c;我们就来深入探讨逻辑回归的原理、实现和应用。 一、逻辑回归的基本概念 1.1 逻辑回归与线性回归的区别…