在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

解決HarmonyOS應用中Image組件白塊問題的有效方案

HarmonyOS開發(fā)者 ? 來源:HarmonyOS開發(fā)者 ? 作者:HarmonyOS開發(fā)者 ? 2025-02-17 10:08 ? 次閱讀

概述

HarmonyOS應用開發(fā)過程中,通過Image組件加載網(wǎng)絡(luò)圖片時,通常會經(jīng)歷四個關(guān)鍵階段:組件創(chuàng)建、圖片資源下載、圖片解碼和刷新。當加載的圖片資源過大時,Image組件會等待圖片數(shù)據(jù)下載和解碼完成后才刷新顯示。由于圖片下載過程耗時較長,在圖片完全加載之前,頁面往往會顯示空白區(qū)域或占位圖(通常為白色或淺色背景),這種現(xiàn)象被稱為“Image 白塊”。“Image 白塊”不僅影響視覺效果,還會降低用戶體驗,因此在開發(fā)中應盡量避免這種情況。

92506c88-eab5-11ef-9310-92fbcf53809c.gif

圖1 Image白塊問題效果圖

為了減少圖片加載時出現(xiàn)的白塊問題,開發(fā)者可以采用預下載和緩存機制。具體來說,可以在組件創(chuàng)建之前,通過網(wǎng)絡(luò)請求將圖片下載并解碼,然后將圖片數(shù)據(jù)緩存到應用沙箱中。當Image組件加載時,首先檢查應用沙箱中是否存在該圖片的緩存數(shù)據(jù)。如果緩存存在,則直接從緩存中讀取圖片,避免重復下載;如果緩存不存在,再進行網(wǎng)絡(luò)請求并下載圖片。通過這種方式,可以有效減少加載大尺寸網(wǎng)絡(luò)圖片時的白屏或白塊現(xiàn)象,縮短加載時間,從而提升用戶體驗。

9297abc0-eab5-11ef-9310-92fbcf53809c.png

圖2 Image加載網(wǎng)絡(luò)圖片兩種方式對比

場景案例

在使用Navigation組件時,開發(fā)者通常會在主頁引入子頁面組件,并通過按鈕點擊實現(xiàn)頁面跳轉(zhuǎn)。如果子頁面需要加載較大的網(wǎng)絡(luò)圖片,且未設(shè)置占位圖,則跳轉(zhuǎn)后可能會出現(xiàn)長時間的白塊現(xiàn)象。為了解決這一問題,可以在父頁面提前下載圖片并緩存到本地。當子頁面加載時,直接從緩存中讀取圖片數(shù)據(jù),從而減少白塊顯示時間,提升用戶體驗。

本文將以應用沙箱提前緩存舉例,給出減少Image白塊出現(xiàn)時長的一種優(yōu)化方案。

優(yōu)化前:使用Image組件直接加載網(wǎng)絡(luò)地址

以下為部分示例代碼:

NavDestination() {
  Row() {
    // 不推薦用法:使用Image直接加載網(wǎng)絡(luò)圖片的方式,受到圖片下載與解析的耗時影響,極易出現(xiàn)白塊。
    Image("https://www.example.com/xxx.png") // 此處請?zhí)顚懸粋€具體的網(wǎng)絡(luò)圖片地址。
      .objectFit(ImageFit.Auto)
      .width('100%')
      .height('100%')
  }
  .width('100%')
  .height('100%')
  .justifyContent(FlexAlign.Center)
}
.title(this.name)
優(yōu)化后:子頁面PageOne中需展示一張較大的網(wǎng)絡(luò)圖片,在父組件的aboutToAppear()中提前發(fā)起網(wǎng)絡(luò)請求,并做判斷文件是否存在,已下載的不再重復請求,存儲在應用沙箱中。當父頁面點擊按鈕跳轉(zhuǎn)子頁面PageOne,此時觸發(fā)pixMap請求讀取應用沙箱中已緩存解碼的網(wǎng)絡(luò)圖片并存儲在LocalStorage中,通過在子頁面的Image中傳入被@StorageLink修飾的變量ImageData進行數(shù)據(jù)刷新,圖片送顯。

92ad46ce-eab5-11ef-9310-92fbcf53809c.png

圖3 使用預下載的方式,由開發(fā)者靈活地處理網(wǎng)絡(luò)圖片,減少白塊出現(xiàn)時長。

以下為關(guān)鍵示例代碼:

1.在父組件里aboutToAppear()中提前發(fā)起網(wǎng)絡(luò)請求,當父頁面點擊按鈕跳轉(zhuǎn)子頁面PageOne,此時觸發(fā)pixMap請求讀取應用沙箱中已緩存解碼的網(wǎng)絡(luò)圖片并存儲在localStorage中。非首次點擊時,不再重復調(diào)用getPixMap(),避免每次點擊都從沙箱里讀取文件。

aboutToAppear(): void {
  httpRequest(); // 在父組件提前發(fā)起網(wǎng)絡(luò)請求
}


build() {
  Navigation(this.childNavStack) {
    Column() {
      Button('push Path to pageOne', { stateEffect: true, type: ButtonType.Capsule })
        .width('80%')
        .height(40)
        .margin({ bottom: '36vp' })
        .onClick(() => {
          if (!localStorage.get('imageData')) { // 非首次點擊,不再重復調(diào)用getPixMap(),避免每次點擊都從沙箱里讀取文件。
            this.getPixMap();
          }
          this.childNavStack.pushPath({ name: 'pageOne' });
        })
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.End)
  }
  .backgroundColor(Color.Transparent)
  .title('ParentNavigation')
}
2.在NetRequest.ets中定義網(wǎng)絡(luò)請求httpRequest(),通過fs.access()檢查文件是否存在,當文件存在時不再重復請求,并寫入沙箱中。
export async function httpRequest() {
  fs.access(fileUrl, fs.AccessModeType.READ).then((res) => { // 檢查文件是否存在
    if (!res) { // 如沙箱里不存在地址,重新請求網(wǎng)絡(luò)圖片資源
      http.createHttp()
        .request('https://www.example.com/xxx.png', // 此處請?zhí)顚懸粋€具體的網(wǎng)絡(luò)圖片地址。
          (error: BusinessError, data: http.HttpResponse) => {
            if (error) {
              // 下載失敗時不執(zhí)行后續(xù)邏輯
              return;
            }
            // 處理網(wǎng)絡(luò)請求返回的數(shù)據(jù)
            if (http.ResponseCode.OK === data.responseCode) {
              const imageData: ArrayBuffer = data.result as ArrayBuffer;
              // 保存圖片到應用沙箱
              readWriteFileWithStream(imageData);
            }
          }
        )
    }
  })
}
3.在子組件中通過在子頁面的Image中傳入被@StorageLink修飾的變量ImageData進行數(shù)據(jù)刷新,圖片送顯。
build() {
  NavDestination() {
    Row() {
      Image(this.imageData) // 正例:此時Image拿到已提前加載好的網(wǎng)絡(luò)圖片,減少了白塊出現(xiàn)時長
        .objectFit(ImageFit.Auto)
        .width('100%')
        .height('100%')
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
  }
  .title(this.name)
}

性能對比分析

1、trace分析

下面,使用trace對優(yōu)化前后性能進行對比分析。

優(yōu)化前查看trace數(shù)據(jù),分析階段的起點為父頁面點擊按鈕開始計時即trace的H:DispatchTouchEvent,結(jié)束點為子頁面圖片渲染的首幀出現(xiàn)即H:CreateImagePixelMap標簽后的第一個Vsync,記錄白塊出現(xiàn)時間為1.3s,其中以H:HttpRequestInner的標簽起始為起點到H:DownloadImageSuccess標簽結(jié)束為終點記錄時間,即為網(wǎng)絡(luò)下載耗時1.2s,因此使用Image直接加載網(wǎng)絡(luò)圖片時,出現(xiàn)長時間Image白塊,其原因是需要等待網(wǎng)絡(luò)下載資源完成。

92cd21ba-eab5-11ef-9310-92fbcf53809c.png

圖4 直接使用Image加載網(wǎng)絡(luò)數(shù)據(jù)

優(yōu)化后查看trace數(shù)據(jù),分析階段的起點為父頁面點擊按鈕開始計時即trace的H:DispatchTouchEvent,結(jié)束點為子頁面圖片渲染的首幀出現(xiàn)即H:CreateImagePixelMap標簽后的第一個Vsync,記錄白塊出現(xiàn)時間為32.6ms,其中記錄H:HttpRequestInner的標簽耗時即為提前網(wǎng)絡(luò)下載的耗時1.16s,對比白塊時長可知提前預下載可以減少白塊出現(xiàn)時長。

92ecdf82-eab5-11ef-9310-92fbcf53809c.png

圖5 使用預下載的方式

說明:網(wǎng)絡(luò)下載耗時實際受到網(wǎng)絡(luò)波動影響,優(yōu)化前后的網(wǎng)絡(luò)下載耗時數(shù)據(jù)總體差異在1s內(nèi),提供的性能數(shù)值僅供參考。

2、效果對比

優(yōu)化前直接使用Image加載網(wǎng)絡(luò)數(shù)據(jù),未使用預下載 優(yōu)化后使用預下載

92506c88-eab5-11ef-9310-92fbcf53809c.gif

932ce046-eab5-11ef-9310-92fbcf53809c.gif

3、數(shù)據(jù)對比

對比數(shù)據(jù)如下:

方案 白塊出現(xiàn)時長(毫秒) 白塊出現(xiàn)時長
(優(yōu)化前)直接使用Image加載網(wǎng)絡(luò)數(shù)據(jù),未使用預下載 1300 圖片位置白塊出現(xiàn)時間較長
(優(yōu)化后)使用預下載 32.6 圖片位置白塊出現(xiàn)時間較短

說明:測試數(shù)據(jù)僅限于示例程序,不同設(shè)備特性和具體應用場景的多樣性,所獲得的性能數(shù)據(jù)存在差異,提供的數(shù)值僅供參考。

由此可見,加載網(wǎng)絡(luò)圖片時,使用預下載,提前處理網(wǎng)絡(luò)請求并從應用沙箱中讀取緩存數(shù)據(jù)的方式,可以減少用戶可見Image白屏或白塊出現(xiàn)時長,提升用戶體驗。

更詳細內(nèi)容請參考:https://developer.huawei.com/consumer/cn/doc/best-practices-V5/bpta-image-white-lump-solution-V5

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Image
    +關(guān)注

    關(guān)注

    0

    文章

    33

    瀏覽量

    12085
  • 組件
    +關(guān)注

    關(guān)注

    1

    文章

    525

    瀏覽量

    18192
  • HarmonyOS
    +關(guān)注

    關(guān)注

    79

    文章

    2005

    瀏覽量

    31670

原文標題:HarmonyOS應用Image白塊問題解決方案

文章出處:【微信號:HarmonyOS_Dev,微信公眾號:HarmonyOS開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    HarmonyOS開發(fā)案例:【imageimage-animator組件

    OpenHarmony提供了常用的圖片、圖片幀動畫播放器組件,開發(fā)者可以根據(jù)實際場景和開發(fā)需求,實現(xiàn)不同的界面交互效果,包括:點擊陰影效果、點擊切換狀態(tài)、點擊動畫效果、點擊切換動效。
    的頭像 發(fā)表于 04-26 17:32 ?1717次閱讀
    <b class='flag-5'>HarmonyOS</b>開發(fā)案例:【<b class='flag-5'>image</b>、<b class='flag-5'>image</b>-animator<b class='flag-5'>組件</b>】

    HarmonyOS開發(fā)案例:【基礎(chǔ)組件Slider的使用】

    學習如何使用聲明式UI編程框架的基礎(chǔ)組件。本篇Codelab將會使用Image組件、Slider組件、Text組件共同實現(xiàn)一個可調(diào)節(jié)的風車動
    的頭像 發(fā)表于 05-10 16:01 ?865次閱讀
    <b class='flag-5'>HarmonyOS</b>開發(fā)案例:【基礎(chǔ)<b class='flag-5'>組件</b>Slider的使用】

    HarmonyOS開發(fā)案例:【常用組件與布局】

    HarmonyOS ArkUI提供了豐富多樣的UI組件,您可以使用這些組件輕松地編寫出更加豐富、漂亮的界面。
    的頭像 發(fā)表于 05-09 18:20 ?1504次閱讀
    <b class='flag-5'>HarmonyOS</b>開發(fā)案例:【常用<b class='flag-5'>組件</b>與布局】

    HarmonyOS開發(fā)--1、組件化的設(shè)計方案

    ”的系統(tǒng)能力為各種硬件開發(fā)提供了全棧的軟件解決方案,并保持了上層接口的統(tǒng)一和分布式能力的統(tǒng)一。HarmonyOS通過組件化和小型化等設(shè)計方法,做到硬件資源的可大可小,在多種終端設(shè)備間,按需彈性部署
    發(fā)表于 09-14 11:30

    HarmonyOS實戰(zhàn)—Image組件的剪切和縮放

    1. Image圖片標簽概述:圖片(Image)是用來顯示圖片的組件。常見的屬性:id,長、寬、高等。具體可以參考華為開發(fā)手冊(組件的通用屬性):https
    發(fā)表于 08-17 18:00

    HarmonyOS組件更新,新增700+開源組件

    組件是對數(shù)據(jù)和方法的簡單封裝,通過使用現(xiàn)成的組件讓應用開發(fā)更加簡單高效。自HarmonyOS組件開源以來,經(jīng)兩次上線,已開源了700+的Java/JS
    發(fā)表于 11-18 11:17

    講解一下HarmonyOS的幾個自定義組件用到的知識

    看下 DrawTask 的描述:在項目開發(fā),我們經(jīng)常會用到自定義組件,此處分享一下 HarmonyOS JS 如何利用 canvas 實現(xiàn)自定義
    發(fā)表于 03-16 16:05

    HarmonyOS應用開發(fā)資料(Svg組件

    1、HarmonyOS應用開發(fā)-Svg組件circle  該組件從API version 7開始支持。后續(xù)版本如有新增內(nèi)容,則采用上角標單獨標記該內(nèi)容的起始版本。2、HarmonyOS
    發(fā)表于 03-17 14:49

    組件資料】HarmonyOS三方件開發(fā)指南

    顯示。1.2.模擬器上運行效果:2、HarmonyOS三方件開發(fā)指南——AsyncHttpHarmony組件1.AsyncHttpHarmony功能介紹1.1.組件介紹在做HarmonyOS
    發(fā)表于 03-21 11:18

    求助,請問如何發(fā)布我的HarmonyOS組件或解決方案

    我要如何發(fā)布我的HarmonyOS組件或解決方案
    發(fā)表于 06-02 15:55

    HarmonyOS/OpenHarmony應用開發(fā)-聲明式開發(fā)范式組件匯總

    類型基礎(chǔ)組件Blank、Button、Checkbox、CheckboxGroup、DataPanel、DatePicker、Divider、Gauge、Image、ImageAnimator
    發(fā)表于 01-19 11:14

    HarmonyOS元服務-動態(tài)創(chuàng)建組件

    示例效果:提供在頁面動態(tài)添加組件,并為動態(tài)添加的組件設(shè)置屬性與樣式的能力(API version 8開始支持)。示例代碼:index.hml<div class="
    發(fā)表于 03-29 10:52

    HarmonyOS組件化設(shè)計方案

    能力、適配多種終端形態(tài)”,HarmonyOS采用了“組件化”的設(shè)計方案,實現(xiàn)根據(jù)設(shè)備的資源能力和業(yè)務特征靈活裁剪,滿足不同形態(tài)終端設(shè)備對操作系統(tǒng)的要求。 一、為什么采用“組件化”設(shè)計
    的頭像 發(fā)表于 10-13 09:59 ?2490次閱讀

    OpenHarmony應用開發(fā)之ETS開發(fā)方式Image組件

    今天帶大家了解ETS開發(fā)方式Image組件
    的頭像 發(fā)表于 07-03 12:06 ?3666次閱讀
    OpenHarmony應用開發(fā)之ETS開發(fā)方式<b class='flag-5'>Image</b><b class='flag-5'>組件</b>

    鴻蒙ArkTS聲明式組件Image

    Image為圖片組件,常用于在應用顯示圖片。Image支持加載[PixelMap]、[ResourceStr]和[DrawableDescriptor]類型的數(shù)據(jù)源,支持png、jp
    的頭像 發(fā)表于 06-23 20:32 ?1457次閱讀
    鴻蒙ArkTS聲明式<b class='flag-5'>組件</b>:<b class='flag-5'>Image</b>
    主站蜘蛛池模板: 1000部禁片黄的免费看 | 精品一区 二区三区免费毛片 | 狠狠色丁香婷婷第六色孕妇 | 手机在线看片国产 | 男人j进女人j免费视频视频 | 国产在线黄 | 伊人网网| 免费看国产一级片 | 免费高清特黄a 大片 | 欧美精品色精品一区二区三区 | 中文字幕不卡一区 | 欧美在线视频一区二区三区 | 亚洲区在线播放 | 乱妇伦小说 | 国产精品久久久香蕉 | 欧美一级黄视频 | 亚洲国产激情在线一区 | 亚洲国产片 | 久久夜色精品国产亚洲噜噜 | 国产精品成人免费观看 | 性视频在线 | 亚洲午夜精品久久久久久成年 | 欧美啪啪精品 | 全国男人天堂网 | 午夜毛片视频高清不卡免费 | 国产精品天天看大片特色视频 | 国产九色在线 | 三级黄色a| 天天干天天干天天干天天干天天干 | 亚洲精品国产自在久久出水 | 久久骚 | 四虎永久精品免费网址大全 | 欧美黄免在线播放 | 日本成人视屏 | 亚洲www视频 | 狼狼狼色精品视频在线播放 | 不卡一级毛片免费高清 | 日日日天天射天天干视频 | 3344免费播放观看视频 | 美女扒开尿口让男人桶 | 天天操夜夜艹 |