处理HarmonyOS使用中Image组件白块问题的有用计划
概述。
在。HarmonyOS。运用开发进程中,经过Image组件加载。网络。图片时,一般会阅历四个要害阶段:组件创立、图片资源。下载。、图片解码和改写。当加载的图片资源过大时,Image组件会等候图片数据下载和解码完结后才改写显现。因为图片下载进程耗时较长,在图片彻底加载之前,页面往往会显现空白区域或占位图(一般为白色或淡色布景),这种现象被称为“Image 白块”。“Image 白块”不只影响视觉作用,还会下降用户体会,因而在开发中应尽量防止这种状况。
图1 Image白块问题作用图。
为了削减图片加载时呈现的白块问题,开发者。能够选用预下载和缓存机制。具体来说,能够在组件创立之前,经过网络恳求将图片下载并解码,然后将图片数据缓存到运用沙箱中。当Image组件加载时,首要检查运用沙箱中是否存在该图片的缓存数据。假如缓存存在,则直接从缓存中读取图片,防止重复下载;假如缓存不存在,再进行网络恳求并下载图片。经过这种方法,能够有用削减加载大尺度网络图片时的白屏或白块现象,缩短加载时刻,然后提高用户体会。
图2 Image加载网络图片两种方法比照。
场景事例。
在运用Navigation组件时,开发者一般会在主页引进子页面组件,并经过按钮点击完结页面跳转。假如子页面需求加载较大的网络图片,且未设置占位图,则跳转后可能会呈现长时刻的白块现象。为了处理这一问题,能够在父页面提早下载图片并缓存到本地。当子页面加载时,直接从缓存中读取图片数据,然后削减白块显现时刻,提高用户体会。
本文将以运用沙箱提早缓存举例,给出削减Image白块呈现时长的一种优化计划。
优化前:运用Image组件直接加载网络地址。
以下为部分示例代码:
NavDes。ti。nation() { Row() { // 不。引荐。用法:运用Image直接加载网络图片的方法,遭到图片下载与解析的耗时影响,极易呈现白块。 Image("https://www.example.com/xxx.png") // 此处请填写一个具体的网络图片地址。 .objec。tF。it(ImageFit.Auto) .width('100%') .height('100%') } .width('100%') .height('100%') .justifyCon。te。nt(FlexAlign.Center)}.title(this.name)。优化后:子页面PageOne中需展现一张较大的网络图片,在父组件的aboutToAppear()中提早建议网络恳求,并做判别文件是否存在,已下载的不再重复恳求,存储在运用沙箱中。当父页面点击按钮跳转子页面PageOne,此刻触发。pi。xMap恳求读取运用沙箱中已缓存解码的网络图片并存储在LocalSt。or。age中,经过在子页面的Image中传入被StorageLink润饰的变量Imag。eDa。ta进行数据改写,图片送显。
图3 运用预下载的方法,由开发者灵敏地处理网络图片,削减白块呈现时长。
以下为要害示例代码:
1.在父组件里aboutToAppear()中提早建议网络恳求,当父页面点击按钮跳转子页面PageOne,此刻触发pixMap恳求读取运用沙箱中已缓存解码的网络图片并存储在localStorage中。非初次点击时,不再重复调用getPixMap(),防止每次点击都从沙箱里读取文件。
aboutToAppear(): void { httpRequest(); // 在父组件提早建议网络恳求}build() { Navigation(this.childNavSt。ac。k) { Column() { Button('push Path to pageOne', { stateEffect: true, type: ButtonType.Capsule }) .width('80%') .height(40) .margin({ bottom: '36vp' }) .onClick(() =>{ if (!localStorage.get('imageData')) { // 非初次点击,不再重复调用getPixMap(),防止每次点击都从沙箱里读取文件。 this.getPixMap(); } this.childNavStack.pushPath({ name: 'pageOne' }); }) } .width('100%') .height('100%') .justifyContent(FlexAlign.End) } .backgroun。dC。olor(Color.Transparent) .title('ParentNavigation')}。2.在NetRequest.ets中界说网络恳求httpRequest(),经过fs.access()检查文件是否存在,当文件存在时不再重复恳求,并写入沙箱中。
export async function httpRequest() { fs.access(fileUrl, fs.AccessModeType.RE。AD。).then((res) =>{ // 检查文件是否存在 if (!res) { // 如沙箱里不存在地址,从头恳求网络图片资源 http.createHttp() .request('https://www.example.com/xxx.png', // 此处请填写一个具体的网络图片地址。 (error: BusinessError, data: http.HttpResponse) =>{ if (error) { // 下载失利时不履行后续逻辑 return; } // 处理网络恳求回来的数据 if (http.ResponseCode.OK === data.responseCode) { const imageData: ArrayBuffer = data.result as ArrayBuffer; // 保存图片到运用沙箱 readWriteFileWithStream(imageData); } } ) } })}。3.在子组件中经过在子页面的Image中传入被StorageLink润饰的变量ImageData进行数据改写,图片送显。
build() { NavDestination() { Row() { Image(this.imageData) // 正例:此刻Image拿到已提早加载好的网络图片,削减了白块呈现时长 .objectFit(ImageFit.Auto) .width('100%') .height('100%') } .width('100%') .height('100%') .justifyContent(FlexAlign.Center) } .title(this.name)}。
功能比照剖析。
1、trace剖析。
下面,运用trace对优化前后功能进行比照剖析。
优化前检查trace数据,剖析阶段的起点为父页面点击按钮开端计时即trace的H:DispatchTouchEvent,完毕点为子页面图片烘托的首帧呈现即H:CreateImagePixelMap。标签。后的第一个Vsync,记载白块呈现时刻为1.3s,其间以H:HttpRequestInner的标签开端为起点到H:Downlo。adI。mageSuccess标签完毕为结尾记载时刻,即为网络下载耗时1.2s,因而运用Image直接加载网络图片时,呈现长时刻Image白块,其原因是需求等候网络下载资源完结。
图4 直接运用Image加载网络数据。
优化后检查trace数据,剖析阶段的起点为父页面点击按钮开端计时即trace的H:DispatchTouchEvent,完毕点为子页面图片烘托的首帧呈现即H:CreateImagePixelMap标签后的第一个Vsync,记载白块呈现时刻为32.6ms,其间记载H:HttpRequestInner的标签耗时即为提早网络下载的耗时1.16s,比照白块时长可知提早预下载能够削减白块呈现时长。
图5 运用预下载的方法。
阐明:网络下载耗时实践遭到网络动摇影响,优化前后的网络下载耗时数据整体差异在1s内,供给的功能数值仅供参阅。
2、作用比照。
优化前直接运用Image加载网络数据,未运用预下载。 | 优化后运用预下载。 |
3、数据比照。
比照数据如下:
计划。 | 白块呈现时长(毫秒)。 | 白块呈现时长。 |
---|---|---|
(优化前)直接运用Image加载网络数据,未运用预下载。 | 1300。 | 图片方位白块呈现时刻较长。 |
(优化后)运用预下载。 | 32.6。 | 图片方位白块呈现时刻较短。 |
阐明:测试数据仅限于示例程序,不同设备特性和具体运用场景的多样性,所取得的功能数据存在差异,供给的数值仅供参阅。
由此可见,加载网络图片时,运用预下载,提早处理网络恳求并从运用沙箱中读取缓存数据的方法,能够削减用户可见Image白屏或白块呈现时长,提高用户体会。
更具体内容请参阅:https://developer.huawei.com/consumer/cn/doc/best-pract。ic。es-V5/bpta-image-white-lump-solution-V5。
内容来源:https://fastrans.nhobethoi.com/app-1/lộ gan mb,http://chatbotjud.saude.mg.gov.br/app-1/horario-pagante-tigre
(责任编辑:咨询)