From f350c32b2ed6a5513c0e3db4192aff69beb72039 Mon Sep 17 00:00:00 2001 From: zgf Date: Thu, 9 May 2024 09:54:16 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BD=91=E7=BB=9C=E8=AF=B7=E6=B1=82=E5=87=8F?= =?UTF-8?q?=E5=B0=91=E6=8B=BC=E6=8E=A5=E6=93=8D=E4=BD=9C=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E7=BD=91=E7=BB=9C=E5=8A=A0=E8=BD=BD=E9=80=9F=E5=BA=A6?= =?UTF-8?q?=E6=85=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zgf --- CHANGELOG.md | 1 + entry/src/main/ets/pages/LongImagePage.ets | 4 +- .../src/main/ets/pages/ManyPhotoShowPage.ets | 2 +- entry/src/main/ets/pages/SingleImage.ets | 10 ++--- entry/src/main/ets/pages/TestIsUrlExist.ets | 3 +- .../ets/pages/TestPrefetchToFileCache.ets | 3 +- entry/src/main/ets/pages/User.ets | 3 +- .../src/main/resources/base/media/failed.png | Bin 0 -> 2455 bytes library/oh-package.json5 | 2 +- library/src/main/ets/ImageKnifeDispatcher.ets | 11 ++--- library/src/main/ets/model/utils.ets | 38 ++++++++++++++++++ 11 files changed, 60 insertions(+), 17 deletions(-) create mode 100644 entry/src/main/resources/base/media/failed.png create mode 100644 library/src/main/ets/model/utils.ets diff --git a/CHANGELOG.md b/CHANGELOG.md index 4cd6cbd..915495b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ - 支持hsp多包图片资源 - 新增putCache写入缓存接口 - 修复入参为pixelMap图片不显示问题 +- 网络请求减少拼接操作,修复网络加载速度慢 ## 3.0.0-rc.3 - 将请求默认并行从64调整到8,减少对taskpool execute内存消耗 diff --git a/entry/src/main/ets/pages/LongImagePage.ets b/entry/src/main/ets/pages/LongImagePage.ets index e8c5716..930396b 100644 --- a/entry/src/main/ets/pages/LongImagePage.ets +++ b/entry/src/main/ets/pages/LongImagePage.ets @@ -28,8 +28,8 @@ struct LongImagePage { imageKnifeOption: { loadSrc:"https://wx2.sinaimg.cn/mw690/006HyQKGgy1hnqp08dw09j30u04twu0x.jpg", //src:$r("app.media.aaa"), - // placeholderSrc: $r("app.media.loading"), - // errorholderSrc: $r("app.media.app_icon"), + placeholderSrc: $r("app.media.loading"), + errorholderSrc: $r("app.media.failed"), objectFit: ImageFit.Auto } }) diff --git a/entry/src/main/ets/pages/ManyPhotoShowPage.ets b/entry/src/main/ets/pages/ManyPhotoShowPage.ets index 0be47d9..58ec187 100644 --- a/entry/src/main/ets/pages/ManyPhotoShowPage.ets +++ b/entry/src/main/ets/pages/ManyPhotoShowPage.ets @@ -41,7 +41,7 @@ struct ManyPhotoShowPage { //src:"https://www.openharmony.cn/_nuxt/img/logo.dcf95b3.png", // src: this.localFile, placeholderSrc:$r("app.media.loading"), - errorholderSrc:$r("app.media.app_icon"), + errorholderSrc:$r("app.media.failed"), objectFit: ImageFit.Auto, border: {radius:50} }}) diff --git a/entry/src/main/ets/pages/SingleImage.ets b/entry/src/main/ets/pages/SingleImage.ets index e908beb..80ab7c1 100644 --- a/entry/src/main/ets/pages/SingleImage.ets +++ b/entry/src/main/ets/pages/SingleImage.ets @@ -45,7 +45,7 @@ struct SingleImage { imageKnifeOption: { loadSrc: $r("app.media.app_icon"), placeholderSrc: $r("app.media.loading"), - errorholderSrc: $r("app.media.app_icon"), + errorholderSrc: $r("app.media.failed"), objectFit: ImageFit.Contain } }).width(100).height(100) @@ -56,7 +56,7 @@ struct SingleImage { imageKnifeOption: { loadSrc: this.localFile, placeholderSrc: $r("app.media.loading"), - errorholderSrc: $r("app.media.app_icon"), + errorholderSrc: $r("app.media.failed"), objectFit: ImageFit.Contain } }).width(100).height(100) @@ -67,7 +67,7 @@ struct SingleImage { imageKnifeOption: { loadSrc:"https://www.openharmony.cn/_nuxt/img/logo.dcf95b3.png", placeholderSrc: $r("app.media.loading"), - errorholderSrc: $r("app.media.app_icon"), + errorholderSrc: $r("app.media.failed"), objectFit: ImageFit.Contain, progressListener:(progress:number)=>{console.info("ImageKnife:: call back progress = " + progress)} } @@ -79,7 +79,7 @@ struct SingleImage { imageKnifeOption: { loadSrc: "https://file.atomgit.com/uploads/user/1704857786989_8994.jpeg", placeholderSrc: $r("app.media.loading"), - errorholderSrc: $r("app.media.app_icon"), + errorholderSrc: $r("app.media.failed"), objectFit: ImageFit.Contain, customGetImage: custom, transformation: new BlurTransformation(10) @@ -92,7 +92,7 @@ struct SingleImage { imageKnifeOption: { loadSrc: this.pixelMap!, placeholderSrc: $r("app.media.loading"), - errorholderSrc: $r("app.media.app_icon"), + errorholderSrc: $r("app.media.failed"), objectFit: ImageFit.Contain, } }).width(100).height(100) diff --git a/entry/src/main/ets/pages/TestIsUrlExist.ets b/entry/src/main/ets/pages/TestIsUrlExist.ets index e547253..4efc4b8 100644 --- a/entry/src/main/ets/pages/TestIsUrlExist.ets +++ b/entry/src/main/ets/pages/TestIsUrlExist.ets @@ -19,7 +19,8 @@ import { ImageKnifeComponent, ImageKnife, ImageKnifeOption, CacheStrategy } from struct TestIsUrlExist { @State imageKnifeOption: ImageKnifeOption = { loadSrc: $r('app.media.startIcon'), - placeholderSrc: $r('app.media.loading') + placeholderSrc: $r('app.media.loading'), + errorholderSrc:$r('app.media.failed') } @State source: PixelMap | string | Resource = $r("app.media.startIcon") @State source1: PixelMap | string | Resource = $r("app.media.startIcon") diff --git a/entry/src/main/ets/pages/TestPrefetchToFileCache.ets b/entry/src/main/ets/pages/TestPrefetchToFileCache.ets index 3248b11..9dfef1f 100644 --- a/entry/src/main/ets/pages/TestPrefetchToFileCache.ets +++ b/entry/src/main/ets/pages/TestPrefetchToFileCache.ets @@ -19,7 +19,8 @@ import { ImageKnifeComponent,ImageKnife,ImageKnifeOption } from '@ohos/imageknif struct TestPrefetchToFileCachePage { @State imageKnifeOption: ImageKnifeOption = { loadSrc:$r('app.media.startIcon'), - placeholderSrc:$r('app.media.loading') + placeholderSrc:$r('app.media.loading'), + errorholderSrc:$r('app.media.failed') } async preload(url:string) { let fileCachePath = await ImageKnife.getInstance().preLoadCache(url) diff --git a/entry/src/main/ets/pages/User.ets b/entry/src/main/ets/pages/User.ets index 09cd970..9309648 100644 --- a/entry/src/main/ets/pages/User.ets +++ b/entry/src/main/ets/pages/User.ets @@ -52,7 +52,8 @@ export struct UserAvatar { this.ImageKnifeOption = { //TODO:写死loadSRC,场景:变更组件大小,所有图片不显示 loadSrc: this.userInfo, - placeholderSrc: $r('app.media.icon'), + placeholderSrc: $r('app.media.loading'), + errorholderSrc: $r('app.media.failed'), border: { radius:20,width:5,color:$r('app.color.start_window_background') }, objectFit:ImageFit.Contain // signature: new ObjectKey(this.userInfo.infoUpdateTime.getTime().toString()) diff --git a/entry/src/main/resources/base/media/failed.png b/entry/src/main/resources/base/media/failed.png new file mode 100644 index 0000000000000000000000000000000000000000..94c63eb88bea46d4b4b46d26df81ffe4f7a9be86 GIT binary patch literal 2455 zcmV;I3263-P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2`ouOK~#8N?Vas$ z6gv<_odINEX8;*M1~>zp0c3zPfDCX34#CcV5D0+~_SJEr$9PsV-7Ts0v7=jc|Jb`D zsn1AiX|%gnr>R3}0za50@PlarKbS58`0wApPtVWKryoCloW6ejdiwbBzBZ{3>sxq2kH{5qh#7n3|gxS@YK1QIhJ9z zH&G|*7OS&lV$o8rz)4!(zkeTX_?}6sdIY@|b)>GbHtd<0v`XmQfHVKa9$f61UNh1r zMi6ba_IP4bBM({21vm|{%-3YZKY#xG`|fc?8!Xv9F{%x{IBOi$<`YxNRsv-I{_(2D`L4CAb8N1UszqK(=$e68WV2yhE* zvf86bo5|OJo(-HiOPh_eadA{>=XGM~nbTwg*RHcKAq&qHF^I)xZDQ)BEa2L^cEbKA zEp%e*p=97>p|OgtJz<|q3*BQClLVaXQD5dUaLpsmBWB}PX|i`> zT~cP?n&F7G=af#Gb$ZEZ(FC03f;5z~yL5z2l~N*B(vBQ4FSS%N0oTksm%Lr-B~1cc zDr;8*X9p-&k)^$s5=W4xGnLqdQv;V0HHIb69imGYv6F`O5(%6NxTbf{^>)5A32|FMMb9a##$I1+bkyV?(r8&f7-U=e% z+S8t;p<7^6M~@pWNE+=@a;Qzyi?JpOC}y(ic~QVgt$zC%hFQihTg)r8(7Y$Ofq z)`T$%Tq?x-?DSGKp!W(JNjq=WTq+8Dukk$5sVz_FJ;M&#dx~bA$D_bw7Y^q8Pg=+W z`UtQQF^|a=pPYK(W za-fd}8%c?qWz}>BT-xR8MJdongdG&CW3Xkn?~LHy4jVz}Nml5i!bW@Tv}Ecg;3->q z-m*Z~xJTHi6qn(Fqf*d&g^k>R?|r!6<2X|(FA19i{#>g^=uLnVjGj~)c6e=%(D&Mz1$?B3CmyhadxO5N-_ltR zPo(qc1gN#VVF&jDoqERV7o7EYbc6#CHDCw#0NwQfMDItOO29_^kJrTByLM~n(i%ML zh!cukG`Qs<#!|3@MuF~nh!O2&>I{Rm->#2flC`Op35_7w=cLf>>vwt%PyBy(r}(KwQd5J?k>wYDvP9YgS}t}S)hB> zL;CTclu>qf5|D;$BlrUm%*g;z8E#i>6AF>Nv`r5A2-`0<$9$pJ}kOq26Pm?5l zgOz@4I49;Ja7_~Bwev>V-0dDiW~#jFBs~hnIc1B$k<`mQ=JKOTn!9sHR26W| zU6-0fO#PFTB;(xCR0SMKOEjM7w47r{7qOELWTfn@t)&L8>E)igPM0pt?qZ2tNevun zDm8z`%C0Vd#tJd)NWZ+pu+&pl-MfgDG?eG8yVo)SN1DWfr$|#eX`Tv}Oo+|Ek(9vU zySux;ub$cxF^a`*=@N@CT$*VSdnCZg zz>(%I#S{8JX<>Vfj#E>+ZV>!+{x-0Ji#as?iw z-H}_HUehCZ>SXQF!L6S!Q~{32S}pVX(tPCR{{Ft{a8KFPLHhX5mT7wrtCDKK5kb>D zTHQ12S^{5V{-X@a(ypbqOq+YjO{xM9Voy1>w=Ydb%p3}o=jZ3Fn}GLn4X(vCE!p;# zX=88C5Sjo-BrU0PyJUJKb1WtS1me>CE&M;X_imZC^|-(sSdD|eXh$+V@$bd##) zz=H^q^a+=qP2ES>L+A#05J4k&CFXcn*Vw1iLD)M2FF9McfM*J7uOFTC-*0k}40jIhOP(U8E`qSpb29>{VCSi!LeIQ(t- z8s5WuxyI-{SkgrRpVDgrKbR))gJ}Xkm?rRpX#zi(Ch&u40za50@PlarKa@_V{{YGy V{e;Ze8}() const headerObj: Record = {} if (request.headers != undefined) { request.headers.forEach((value) => { @@ -299,11 +301,7 @@ async function requestJob(request: RequestJobRequest): Promise { - if (resBuf == undefined) { - resBuf = data - } else { - resBuf = buffer.concat([buffer.from(resBuf), buffer.from(data)]).buffer; - } + arrayBuffers.push(data) }); httpRequest.on('dataReceiveProgress', (data: RequestData) => { @@ -318,6 +316,9 @@ async function requestJob(request: RequestJobRequest): Promise { + if (data == 200) { + resBuf = combineArrayBuffers(arrayBuffers) + } }).catch((err: Error) => { LogUtil.error("requestInStream ERROR : err = " + JSON.stringify(err)); }); diff --git a/library/src/main/ets/model/utils.ets b/library/src/main/ets/model/utils.ets new file mode 100644 index 0000000..d5d4269 --- /dev/null +++ b/library/src/main/ets/model/utils.ets @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export function combineArrayBuffers(arrayBuffers: ArrayBuffer[]): ArrayBuffer { + // 计算多个ArrayBuffer的总字节大小 + let totalByteLength = 0; + for (const arrayBuffer of arrayBuffers) { + totalByteLength += arrayBuffer.byteLength; + } + + // 创建一个新的ArrayBuffer + const combinedArrayBuffer = new ArrayBuffer(totalByteLength); + + // 创建一个Uint8Array来操作新的ArrayBuffer + const combinedUint8Array = new Uint8Array(combinedArrayBuffer); + + // 依次复制每个ArrayBuffer的内容到新的ArrayBuffer中 + let offset = 0; + for (const arrayBuffer of arrayBuffers) { + const sourceUint8Array = new Uint8Array(arrayBuffer); + combinedUint8Array.set(sourceUint8Array, offset); + offset += sourceUint8Array.length; + } + + return combinedArrayBuffer; +} \ No newline at end of file