From 6719e8ab19a8bef9034883140a1fe754b1695136 Mon Sep 17 00:00:00 2001 From: zgf Date: Thu, 5 Dec 2024 18:04:33 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BD=91=E7=BB=9C=E8=AF=B7?= =?UTF-8?q?=E6=B1=82readTimeout=E5=92=8C=E6=97=A5=E5=BF=97=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zgf --- CHANGELOG.md | 1 + README_zh.md | 44 +++++++++---------- library/src/main/ets/ImageKnifeDispatcher.ets | 4 +- library/src/main/ets/ImageKnifeLoader.ets | 37 +++++++++++----- .../ets/components/ImageKnifeComponent.ets | 8 +--- 5 files changed, 52 insertions(+), 42 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3578558..89ec477 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - Change the initial value of the PixelMap component of ImageKnife to ImageContent EMPTY - Clear memory cache, cancel pixel map release - Loading process log modification +- Change the network request readTimeout to 30s ## 3.2.0-rc.4 - Support ICO format images diff --git a/README_zh.md b/README_zh.md index cda851b..8032d64 100644 --- a/README_zh.md +++ b/README_zh.md @@ -355,28 +355,28 @@ async function custom(context: Context, src: string | PixelMap | Resource,header ### ImageKnifeOption参数列表 -| 参数名称 | 入参内容 | 功能简介 | -|-----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------| -| loadSrc | string、PixelMap、Resource | 主图展示 | -| placeholderSrc | PixelMap、Resource | 占位图图展示(可选) | -| errorholderSrc | PixelMap、Resource | 错误图展示(可选) | -| objectFit | ImageFit | 主图填充效果(可选) | -| placeholderObjectFit | ImageFit | 占位图填充效果(可选) | -| errorholderObjectFit | ImageFit | 错误图填充效果(可选) | -| writeCacheStrategy | CacheStrategyType | 写入缓存策略(可选) | -| onlyRetrieveFromCache | boolean | 是否跳过网络和本地请求(可选) | -| customGetImage | customGetImage?:(context: Context, src: string、PixelMap、Resource ,headers?: Record) => Promise | 自定义下载图片(可选) | | Resource | 错误占位图数据源 | -| border | BorderOptions | 边框圆角(可选) | -| priority | taskpool.Priority | 加载优先级(可选) | -| context | common.UIAbilityContext | 上下文(可选) | -| progressListener | (progress: number)=>void | 进度(可选) | -| signature | String | 自定义缓存关键字(可选) | -| headerOption | Array | 设置请求头(可选) | -| transformation | PixelMapTransformation | 图片变换(可选) | -| drawingColorFilter | ColorFilter、drawing.ColorFilter | 图片变换(可选) | -| onComplete | (event:EventImage、undefined) => void | 颜色滤镜效果(可选) | -| onLoadListener | onLoadStart?: (req?: ImageKnifeRequest) => void,onLoadSuccess?: (data: string \| PixelMap \| undefined, imageData: ImageKnifeData, req?: ImageKnifeRequest) => void,onLoadFailed?: (err: string, req?: ImageKnifeRequest) => void,onLoadCancel?: (res: string, req?: ImageKnifeRequest) => void | 监听图片加载成功与失败 | -| downsampleOf | DownsampleStrategy | 降采样(可选) | +| 参数名称 | 入参内容 | 功能简介 | +|-----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------| +| loadSrc | string、PixelMap、Resource | 主图展示 | +| placeholderSrc | PixelMap、Resource | 占位图图展示(可选) | +| errorholderSrc | PixelMap、Resource | 错误图展示(可选) | +| objectFit | ImageFit | 主图填充效果(可选) | +| placeholderObjectFit | ImageFit | 占位图填充效果(可选) | +| errorholderObjectFit | ImageFit | 错误图填充效果(可选) | +| writeCacheStrategy | CacheStrategyType | 写入缓存策略(可选) | +| onlyRetrieveFromCache | boolean | 是否跳过网络和本地请求(可选) | +| customGetImage | customGetImage?:(context: Context, src: string、PixelMap、Resource ,headers?: Record) => Promise | 自定义下载图片(可选) | | Resource | 错误占位图数据源 | +| border | BorderOptions | 边框圆角(可选) | +| priority | taskpool.Priority | 加载优先级(可选) | +| context | common.UIAbilityContext | 上下文(可选) | +| progressListener | (progress: number)=>void | 进度(可选) | +| signature | String | 自定义缓存关键字(可选) | +| headerOption | Array | 设置请求头(可选) | +| transformation | PixelMapTransformation | 图片变换(可选) | +| drawingColorFilter | ColorFilter、drawing.ColorFilter | 颜色滤镜效果(可选) | +| onComplete | (event:EventImage、undefined) => void | 图片成功回调事件(可选) | +| onLoadListener | onLoadStart?: (req?: ImageKnifeRequest) => void,onLoadSuccess?: (data: string \| PixelMap \| undefined, imageData: ImageKnifeData, req?: ImageKnifeRequest) => void,onLoadFailed?: (err: string, req?: ImageKnifeRequest) => void,onLoadCancel?: (res: string, req?: ImageKnifeRequest) => void | 监听图片加载成功与失败 | +| downsampleOf | DownsampleStrategy | 降采样(可选) | ### 降采样类型 | 类型 | 相关描述 | diff --git a/library/src/main/ets/ImageKnifeDispatcher.ets b/library/src/main/ets/ImageKnifeDispatcher.ets index 3462c30..4de0eb2 100644 --- a/library/src/main/ets/ImageKnifeDispatcher.ets +++ b/library/src/main/ets/ImageKnifeDispatcher.ets @@ -83,7 +83,6 @@ export class ImageKnifeDispatcher { request.imageKnifeOption.onLoadListener.onLoadStart(request) LogUtil.log('MemoryCache_onLoadStart:' + request.componentId + ',srcType:' + requestSource + ',version:' + request.componentVersion) } - this.copyMemoryCacheInfo(memoryCache, request.imageKnifeData); LogUtil.log('MemoryCache_showPixelMap.start:' + request.componentId + ',srcType:' + requestSource + ',version:' + request.componentVersion) request.ImageKnifeRequestCallback?.showPixelMap(request.componentVersion, memoryCache.source, { width: memoryCache.imageWidth, height: memoryCache.imageHeight }, requestSource, memoryCache.imageAnimator) @@ -93,6 +92,7 @@ export class ImageKnifeDispatcher { request.requestState = ImageKnifeRequestState.COMPLETE // 回调请求开结束 if (request.imageKnifeOption.onLoadListener?.onLoadSuccess !== undefined) { + this.copyMemoryCacheInfo(memoryCache, request.imageKnifeData); request.imageKnifeOption.onLoadListener.onLoadSuccess(memoryCache.source, memoryCache, request) LogUtil.log('MemoryCache_onLoadSuccess:' + request.componentId + ',srcType:' + requestSource + ',version:' + request.componentVersion) } @@ -443,7 +443,6 @@ export class ImageKnifeDispatcher { requestWithSource.source === ImageKnifeRequestSource.ERROR_HOLDER || (requestWithSource.source === ImageKnifeRequestSource.PLACE_HOLDER && requestWithSource.request.requestState === ImageKnifeRequestState.PROGRESS)) { - this.assembleImageKnifeData(requestWithSource.request.imageKnifeData, imageKnifeData,requestWithSource.request); LogUtil.log('getAndShowImage_showPixelMap.start:' + currentRequest.componentId + ',srcType:' + requestSource + ',version:' + currentRequest.componentVersion) requestWithSource.request.ImageKnifeRequestCallback.showPixelMap(requestWithSource.request.componentVersion, imageKnifeData.source, { width: imageKnifeData.imageWidth, height: imageKnifeData.imageHeight }, @@ -456,6 +455,7 @@ export class ImageKnifeDispatcher { if (requestWithSource.request.imageKnifeOption.onLoadListener && requestWithSource.request.imageKnifeOption.onLoadListener.onLoadSuccess) { // 回调请求成功 + this.assembleImageKnifeData(requestWithSource.request.imageKnifeData, imageKnifeData,requestWithSource.request); requestWithSource.request.imageKnifeOption.onLoadListener.onLoadSuccess(imageKnifeData.source, saveCacheImageData, requestWithSource.request); LogUtil.log('getAndShowImage_onLoadSuccess:' + currentRequest.componentId + ',srcType:' + requestSource + ',version:' + currentRequest.componentVersion) diff --git a/library/src/main/ets/ImageKnifeLoader.ets b/library/src/main/ets/ImageKnifeLoader.ets index 3db23e6..d520784 100644 --- a/library/src/main/ets/ImageKnifeLoader.ets +++ b/library/src/main/ets/ImageKnifeLoader.ets @@ -49,17 +49,26 @@ export class ImageKnifeLoader { static execute(request: RequestJobRequest, requestList: List | undefined, fileKey: string){ ImageKnifeLoader.getImageArrayBuffer(request,requestList,fileKey) } + static getUnit8Array (resBuf: ArrayBuffer) { + let unit8 = new Uint8Array(resBuf) + let unitString = '' + if (unit8.length >= 3) { + unitString = unit8[0] + ',' + unit8[1] + ',' + unit8[2] + } else if (unit8.length > 0 && unit8.length < 3) { + unitString = unit8.length + '' + } + return unitString + } static async parseImage(resBuf: ArrayBuffer, fileKey: string, request: RequestJobRequest, callBackData: ImageKnifeData) { callBackData.bufSize = resBuf.byteLength; let typeValue = new FileTypeUtil().getFileType(resBuf); if(typeValue == null) { - let unit8 = new Uint8Array(resBuf) LogUtil.log('requestJob.end: getFileType is null: ' + request.componentId + ',srcType:' + request.requestSource + ',' + request.componentVersion) ImageKnifeLoader.makeEmptyResult(request, - 'request is not a valid image source:' + request.componentId + ',srcType:' + request.requestSource + ',' + - request.componentVersion + ',buffer:' + resBuf.byteLength + ',unit8:' + unit8[0] + ',' + - unit8[1] + ',' + unit8[2], + 'request is not a valid image source:' + request.src + ',componentId' + request.componentId + ',srcType:' + + request.requestSource + ',' + + request.componentVersion + ',buffer:' + resBuf.byteLength + ',unit8:' + ImageKnifeLoader.getUnit8Array(resBuf), ImageKnifeLoader.assembleError(callBackData, LoadPhase.PHASE_GET_FORMAT, LoadPixelMapCode.IMAGE_PARSE_FORMAT_FAILED_CODE)) return @@ -407,13 +416,19 @@ export class ImageKnifeLoader { return headerObj } static FileCacheParseImage(request:RequestJobRequest,resBuf:ArrayBuffer,fileKey:string, callBackData: ImageKnifeData){ - // 保存文件缓存 - if (resBuf !== undefined && request.writeCacheStrategy !== CacheStrategy.Memory) { - LogUtil.log('requestJob_saveFileCacheOnlyFile.start:' + request.componentId + ',srcType:' + request.requestSource + ',' + request.componentVersion) - FileCache.saveFileCacheOnlyFile(request.context, fileKey, resBuf , request.fileCacheFolder) - LogUtil.log('requestJob_saveFileCacheOnlyFile.end:' + request.componentId + ',srcType:' + request.requestSource + ',' + request.componentVersion) + try { + // 保存文件缓存 + if (resBuf !== undefined && request.writeCacheStrategy !== CacheStrategy.Memory) { + LogUtil.log('requestJob_saveFileCacheOnlyFile.start:' + request.componentId + ',srcType:' + request.requestSource + ',' + request.componentVersion) + FileCache.saveFileCacheOnlyFile(request.context, fileKey, resBuf , request.fileCacheFolder) + LogUtil.log('requestJob_saveFileCacheOnlyFile.end:' + request.componentId + ',srcType:' + request.requestSource + ',' + request.componentVersion) + } + ImageKnifeLoader.parseImage(resBuf,fileKey,request, callBackData) + } catch (e) { + ImageKnifeLoader.makeEmptyResult(request, + 'image load FileCacheParseImage error:' + e + ',componentId' + request.componentId + ',srcType:' + + request.requestSource + ',' + request.componentVersion) } - ImageKnifeLoader.parseImage(resBuf,fileKey,request, callBackData) } // 获取图片资源 static async getImageArrayBuffer(request: RequestJobRequest, requestList: List | undefined,fileKey:string) { @@ -511,7 +526,7 @@ export class ImageKnifeLoader { method: http.RequestMethod.GET, expectDataType: http.HttpDataType.ARRAY_BUFFER, connectTimeout: 60000, - readTimeout: 0, + readTimeout: 30000, // usingProtocol:http.HttpProtocol.HTTP1_1 // header: new Header('application/json') caPath: request.caPath === undefined ? undefined : request.caPath, diff --git a/library/src/main/ets/components/ImageKnifeComponent.ets b/library/src/main/ets/components/ImageKnifeComponent.ets index a977487..5387d82 100644 --- a/library/src/main/ets/components/ImageKnifeComponent.ets +++ b/library/src/main/ets/components/ImageKnifeComponent.ets @@ -152,15 +152,9 @@ export struct ImageKnifeComponent { return //针对reuse场景,不显示历史图片 } this.pixelMap = pixelMap - let memory = this.request?.imageKnifeData?.timeInfo?.memoryCheckEndTime ? 1 : 0 - let fileCache = this.request?.imageKnifeData?.timeInfo?.diskCheckEndTime ? 1 : 0 - let net = this.request?.imageKnifeData?.timeInfo?.netRequestEndTime ? 1 : 0 - memory = memory - fileCache - fileCache = fileCache - net - let source = memory == 1 ? 'memory' : fileCache == 1 ? 'fileCache' : 'downLoad' LogUtil.info('image load showPixelMap:' + this.request?.componentId + ',srcType:' + requestSource + ',version:' + this.request?.componentVersion + - ',size:' + JSON.stringify(size) + ',source:' + source) + ',size:' + JSON.stringify(size)) if (typeof this.pixelMap !== 'string') { if (this.imageKnifeOption.objectFit === ImageFit.Auto && this.isImageFitAutoResize == false) { this.adaptiveHeight = this.currentWidth * size.height / size.width