diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e6eed0..025c59a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ - Dealing with exception scenarios where imageSource.getImageInfo return undefined - Fix inability to parse Resource format images of other modules - Improve the error logs +- Fix callback onLoadFailed when taskpool exception occurs ## 3.2.0-rc.2 - Added callback information for image loading diff --git a/README_zh.md b/README_zh.md index 7beab99..9e65f65 100644 --- a/README_zh.md +++ b/README_zh.md @@ -272,16 +272,16 @@ ImageKnifeComponent({ ImageKnifeOption: = { objectFit: ImageFit.Contain, onLoadListener: { onLoadStart: (req) => { - let startCallBackData = JSON.stringify(req?.getImageKnifeData()); + let startCallBackData = JSON.stringify(req?.imageKnifeData); }, onLoadFailed: (res, req) => { - let failedBackData = res + ";" + JSON.stringify(req?.getImageKnifeData()); + let failedBackData = res + ";" + JSON.stringify(req?.imageKnifeData); }, onLoadSuccess: (data, imageData, req) => { - let successBackData = JSON.stringify(req?.getImageKnifeData()); + let successBackData = JSON.stringify(req?.imageKnifeData); }, onLoadCancel: (res, req) => { - let cancelBackData = res + ";" + JSON.stringify(req?.getImageKnifeData()); + let cancelBackData = res + ";" + JSON.stringify(req?.imageKnifeData); } }, border: { radius: 50 }, diff --git a/entry/src/main/ets/pages/TestImageKnifeCallbackPage.ets b/entry/src/main/ets/pages/TestImageKnifeCallbackPage.ets index ae0abb4..6b4f320 100644 --- a/entry/src/main/ets/pages/TestImageKnifeCallbackPage.ets +++ b/entry/src/main/ets/pages/TestImageKnifeCallbackPage.ets @@ -94,13 +94,13 @@ struct TestImageKnifeCallbackPage { this.analyzeStartCallBackData(data); }, onLoadFailed: (res, req) => { - this.analyzeFailedBackData(res, req?.getImageKnifeData()); + this.analyzeFailedBackData(res, req?.imageKnifeData); }, onLoadSuccess: (data, imageData, req) => { - this.analyzeSuccessCallBackData(req?.getImageKnifeData()); + this.analyzeSuccessCallBackData(req?.imageKnifeData); }, onLoadCancel: (res, req) => { - this.analyzeFailedBackData(res, req?.getImageKnifeData()); + this.analyzeFailedBackData(res, req?.imageKnifeData); } }, border: { radius: 50 }, @@ -124,13 +124,13 @@ struct TestImageKnifeCallbackPage { this.analyzeStartCallBackData(data); }, onLoadFailed: (res, req) => { - this.analyzeFailedBackData(res, req?.getImageKnifeData()); + this.analyzeFailedBackData(res, req?.imageKnifeData); }, onLoadSuccess: (data, imageData, req) => { - this.analyzeSuccessCallBackData(req?.getImageKnifeData()); + this.analyzeSuccessCallBackData(req?.imageKnifeData); }, onLoadCancel: (res, req) => { - this.analyzeFailedBackData(res, req?.getImageKnifeData()); + this.analyzeFailedBackData(res, req?.imageKnifeData); } }, border: { radius: 50 }, @@ -153,13 +153,13 @@ struct TestImageKnifeCallbackPage { this.analyzeStartCallBackData(data); }, onLoadFailed: (res, req) => { - this.analyzeFailedBackData(res, req?.getImageKnifeData()); + this.analyzeFailedBackData(res, req?.imageKnifeData); }, onLoadSuccess: (data, imageData, req) => { - this.analyzeSuccessCallBackData(req?.getImageKnifeData()); + this.analyzeSuccessCallBackData(req?.imageKnifeData); }, onLoadCancel: (res, req) => { - this.analyzeFailedBackData(res, req?.getImageKnifeData()); + this.analyzeFailedBackData(res, req?.imageKnifeData); } }, border: { radius: 50 }, @@ -185,13 +185,13 @@ struct TestImageKnifeCallbackPage { this.analyzeStartCallBackData(data); }, onLoadFailed: (res, req) => { - this.analyzeFailedBackData(res, req?.getImageKnifeData()); + this.analyzeFailedBackData(res, req?.imageKnifeData); }, onLoadSuccess: (data, imageData, req) => { - this.analyzeSuccessCallBackData(req?.getImageKnifeData()); + this.analyzeSuccessCallBackData(req?.imageKnifeData); }, onLoadCancel: (res, req) => { - this.analyzeFailedBackData(res, req?.getImageKnifeData()); + this.analyzeFailedBackData(res, req?.imageKnifeData); } }, border: { radius: 50 }, @@ -215,13 +215,13 @@ struct TestImageKnifeCallbackPage { this.analyzeStartCallBackData(data); }, onLoadFailed: (res, req) => { - this.analyzeFailedBackData(res, req?.getImageKnifeData()); + this.analyzeFailedBackData(res, req?.imageKnifeData); }, onLoadSuccess: (data, imageData, req) => { - this.analyzeSuccessCallBackData(req?.getImageKnifeData()); + this.analyzeSuccessCallBackData(req?.imageKnifeData); }, onLoadCancel: (res, req) => { - this.analyzeFailedBackData(res, req?.getImageKnifeData()); + this.analyzeFailedBackData(res, req?.imageKnifeData); } }, border: { radius: 50 }, @@ -244,13 +244,13 @@ struct TestImageKnifeCallbackPage { this.analyzeStartCallBackData(data); }, onLoadFailed: (res, req) => { - this.analyzeFailedBackData(res, req?.getImageKnifeData()); + this.analyzeFailedBackData(res, req?.imageKnifeData); }, onLoadSuccess: (data, imageData, req) => { - this.analyzeSuccessCallBackData(req?.getImageKnifeData()); + this.analyzeSuccessCallBackData(req?.imageKnifeData); }, onLoadCancel: (res, req) => { - this.analyzeFailedBackData(res, req?.getImageKnifeData()); + this.analyzeFailedBackData(res, req?.imageKnifeData); } }, border: { radius: 50 }, @@ -276,13 +276,13 @@ struct TestImageKnifeCallbackPage { this.analyzeStartCallBackData(data); }, onLoadFailed: (res, req) => { - this.analyzeFailedBackData(res, req?.getImageKnifeData()); + this.analyzeFailedBackData(res, req?.imageKnifeData); }, onLoadSuccess: (data, imageData, req) => { - this.analyzeSuccessCallBackData(req?.getImageKnifeData()); + this.analyzeSuccessCallBackData(req?.imageKnifeData); }, onLoadCancel: (res, req) => { - this.analyzeFailedBackData(res, req?.getImageKnifeData()); + this.analyzeFailedBackData(res, req?.imageKnifeData); } }, border: { radius: 50 }, @@ -331,7 +331,7 @@ struct TestImageKnifeCallbackPage { } analyzeStartCallBackData(req: ImageKnifeRequest | undefined) { - let data = req?.getImageKnifeData(); + let data = req?.imageKnifeData; if (data) { if (typeof req?.imageKnifeOption.loadSrc == 'string') { this.url = req?.imageKnifeOption.loadSrc; diff --git a/entry/src/main/ets/pages/TestListImageKnifeCallbackPage.ets b/entry/src/main/ets/pages/TestListImageKnifeCallbackPage.ets index 32bc631..c2d2454 100644 --- a/entry/src/main/ets/pages/TestListImageKnifeCallbackPage.ets +++ b/entry/src/main/ets/pages/TestListImageKnifeCallbackPage.ets @@ -81,16 +81,16 @@ struct TestListImageKnifeCallbackPage { console.log('listCache start:{ url:' + data?.imageKnifeOption.loadSrc + ',componentWidth:' + data?.componentWidth + ',componentHeight:' + data?.componentHeight + - '},' + JSON.stringify(data?.getImageKnifeData())) + '},' + JSON.stringify(data?.imageKnifeData)) }, onLoadFailed: (res, req) => { - console.log('listCache onLoadFailed:res:' + res + ';' + JSON.stringify(req?.getImageKnifeData())) + console.log('listCache onLoadFailed:res:' + res + ';' + JSON.stringify(req?.imageKnifeData)) }, onLoadSuccess: (data, imageData,req) => { - console.log('listCache onLoadSuccess:' + JSON.stringify(req?.getImageKnifeData())) + console.log('listCache onLoadSuccess:' + JSON.stringify(req?.imageKnifeData)) }, onLoadCancel: (res, req) => { - console.log('listCache onLoadCancel:res:' + res + ';' + JSON.stringify(req?.getImageKnifeData())) + console.log('listCache onLoadCancel:res:' + res + ';' + JSON.stringify(req?.imageKnifeData)) } }, border: { radius: 50 }, diff --git a/entry/src/ohosTest/ets/test/ImageKnifeOption.test.ets b/entry/src/ohosTest/ets/test/ImageKnifeOption.test.ets index 6a3acac..7a03c64 100644 --- a/entry/src/ohosTest/ets/test/ImageKnifeOption.test.ets +++ b/entry/src/ohosTest/ets/test/ImageKnifeOption.test.ets @@ -44,7 +44,7 @@ export default function ImageKnifeOptionTest() { imageWidth: 0, imageHeight: 0, } - let imageKnifeOption: ImageKnifeOption = new ImageKnifeOption({ + let imageKnifeOption: ImageKnifeOption = { loadSrc: $r("app.media.rabbit"), onLoadListener: { onLoadFailed: (err) => { @@ -58,7 +58,7 @@ export default function ImageKnifeOptionTest() { return data; }, }, - }) + } if (imageKnifeOption.onLoadListener && imageKnifeOption.onLoadListener.onLoadSuccess && imageKnifeOption.onLoadListener.onLoadFailed) { imageKnifeOption.onLoadListener.onLoadSuccess(a,imageData); imageKnifeOption.onLoadListener.onLoadFailed(a); diff --git a/entry/src/ohosTest/ets/test/loadCallBackData.test.ets b/entry/src/ohosTest/ets/test/loadCallBackData.test.ets index 0b00aa9..f03d17f 100644 --- a/entry/src/ohosTest/ets/test/loadCallBackData.test.ets +++ b/entry/src/ohosTest/ets/test/loadCallBackData.test.ets @@ -53,10 +53,10 @@ export default function loadCallBackData() { await new Promise((resolve, reject) => { imageKnifeOption.onLoadListener = { onLoadStart: (data) => { - startCallBack = data?.getImageKnifeData(); + startCallBack = data?.imageKnifeData; }, onLoadSuccess: (data, imageknifeData,req) => { - successCallBack = req?.getImageKnifeData(); + successCallBack = req?.imageKnifeData; resolve("") }, onLoadFailed(err) { @@ -93,7 +93,7 @@ export default function loadCallBackData() { onLoadSuccess: (data, imageknifeData) => { }, onLoadFailed(res,req) { - failedCallBack = req?.getImageKnifeData(); + failedCallBack = req?.imageKnifeData; resolve(res) } } diff --git a/library/src/main/ets/ImageKnifeDispatcher.ets b/library/src/main/ets/ImageKnifeDispatcher.ets index 7121169..b34e970 100644 --- a/library/src/main/ets/ImageKnifeDispatcher.ets +++ b/library/src/main/ets/ImageKnifeDispatcher.ets @@ -64,8 +64,8 @@ export class ImageKnifeDispatcher { } //记录ImageKnifeRequestSource.SRC 开始内存检查的时间点 - if (requestSource == ImageKnifeRequestSource.SRC && request.getImageKnifeData()) { - let timeInfo = request.getImageKnifeData()?.timeInfo + if (requestSource == ImageKnifeRequestSource.SRC && request.imageKnifeData) { + let timeInfo = request.imageKnifeData?.timeInfo if (timeInfo) { timeInfo.memoryCheckStartTime = memoryCheckStartTime; timeInfo.memoryCheckEndTime = Date.now(); @@ -93,7 +93,7 @@ export class ImageKnifeDispatcher { request.requestState = ImageKnifeRequestState.COMPLETE // 回调请求开结束 if (request.imageKnifeOption.onLoadListener?.onLoadSuccess !== undefined) { - this.copyMemoryCacheInfo(memoryCache, request.getImageKnifeData()); + this.copyMemoryCacheInfo(memoryCache, request.imageKnifeData); request.imageKnifeOption.onLoadListener.onLoadSuccess(memoryCache.source, memoryCache, request) LogUtil.log('ImageKnife_DataTime_MemoryCache_onLoadSuccess:' + request.imageKnifeOption.loadSrc) } @@ -131,7 +131,7 @@ export class ImageKnifeDispatcher { afterCallData.timeInfo.memoryCheckEndTime = beforeCallData.timeInfo.memoryCheckEndTime; } } - req.setImageKnifeData(afterCallData); + req.imageKnifeData = afterCallData; } private initCallData(request: ImageKnifeRequest) { @@ -151,7 +151,7 @@ export class ImageKnifeDispatcher { callBackData.timeInfo = callBackTimeInfo; //跟隨請求保存回調信息點 - request.setImageKnifeData(callBackData); + request.imageKnifeData = callBackData; } enqueue(request: ImageKnifeRequest,isAnimator?: boolean): void { @@ -295,8 +295,23 @@ export class ImageKnifeDispatcher { if (isWatchProgress){ emitter.off(Constants.PROGRESS_EMITTER + memoryKey) } - this.executingJobMap.remove(memoryKey); - this.dispatchNextJob(); + + this.doTaskCallback({ + pixelMap: undefined, + bufferSize: 0, + fileKey: '', + loadFail: 'Fail to requestJob in sub thread src=' + imageSrc + ' err=' + err, + imageKnifeData: { + source: '', + imageWidth: 0, + imageHeight: 0, + timeInfo: { requestEndTime: Date.now() }, + errorInfo: { + phase: LoadPhase.PHASE_LOAD, + code: LoadPixelMapCode.IMAGE_CUSTOM_LOAD_FAILED_CODE, + } + } + }, requestList!, currentRequest, memoryKey, imageSrc, requestSource, isAnimator) }) } else { //主线程请求 LogUtil.log('ImageKnife_DataTime_getAndShowImage_execute.start(mainthread):' + currentRequest.imageKnifeOption.loadSrc) @@ -305,8 +320,23 @@ export class ImageKnifeDispatcher { emitter.off(Constants.CALLBACK_EMITTER + memoryKey) LogUtil.error('Fail to requestJob in main thread src=' + imageSrc + ' err=' + err) LogUtil.log('ImageKnife_DataTime_getAndShowImage.end:' + currentRequest.imageKnifeOption.loadSrc) - this.executingJobMap.remove(memoryKey); - this.dispatchNextJob(); + + this.doTaskCallback({ + pixelMap: undefined, + bufferSize: 0, + fileKey: '', + loadFail: 'Fail to requestJob in main thread src=' + imageSrc + ' err=' + err, + imageKnifeData: { + source: '', + imageWidth: 0, + imageHeight: 0, + timeInfo: { requestEndTime: Date.now() }, + errorInfo: { + phase: LoadPhase.PHASE_LOAD, + code: LoadPixelMapCode.IMAGE_CUSTOM_LOAD_FAILED_CODE, + } + } + }, requestList!, currentRequest, memoryKey, imageSrc, requestSource, isAnimator) }) } } @@ -345,7 +375,7 @@ export class ImageKnifeDispatcher { if (requestWithSource.source === ImageKnifeRequestSource.SRC && requestWithSource.request.imageKnifeOption.onLoadListener?.onLoadFailed !== undefined && requestJobResult.loadFail) { - this.assembleImageKnifeData(requestWithSource.request.getImageKnifeData(), requestJobResult.imageKnifeData, requestWithSource.request) + this.assembleImageKnifeData(requestWithSource.request.imageKnifeData, requestJobResult.imageKnifeData, requestWithSource.request) requestWithSource.request.imageKnifeOption.onLoadListener.onLoadFailed(requestJobResult.loadFail,requestWithSource.request); LogUtil.log('ImageKnife_DataTime_getAndShowImage_onLoadFailed:'+currentRequest.imageKnifeOption.loadSrc) } @@ -432,7 +462,7 @@ export class ImageKnifeDispatcher { if (requestWithSource.request.imageKnifeOption.onLoadListener && requestWithSource.request.imageKnifeOption.onLoadListener.onLoadSuccess) { // 回调请求成功 - this.assembleImageKnifeData(requestWithSource.request.getImageKnifeData(), imageKnifeData,requestWithSource.request); + this.assembleImageKnifeData(requestWithSource.request.imageKnifeData, imageKnifeData,requestWithSource.request); requestWithSource.request.imageKnifeOption.onLoadListener.onLoadSuccess(imageKnifeData.source, saveCacheImageData, requestWithSource.request); LogUtil.log('ImageKnife_DataTime_getAndShowImage_onLoadSuccess:'+currentRequest.imageKnifeOption.loadSrc) @@ -445,7 +475,7 @@ export class ImageKnifeDispatcher { // 回调请求成功 // 回调请求成功 //设置失败回调的时间点 - let callBackData = requestWithSource.request.getImageKnifeData(); + let callBackData = requestWithSource.request.imageKnifeData; if (requestJobResult.imageKnifeData && requestJobResult.imageKnifeData.timeInfo) { requestJobResult.imageKnifeData.timeInfo.requestCancelTime = Date.now(); @@ -484,7 +514,7 @@ export class ImageKnifeDispatcher { break }else if (request.requestState == ImageKnifeRequestState.DESTROY && request.imageKnifeOption.onLoadListener?.onLoadCancel) { //构建回调错误信息 - let callBackData = request.getImageKnifeData(); + let callBackData = request.imageKnifeData; if (callBackData) { let timeInfo: TimeInfo = ImageKnifeLoader.getTimeInfo(callBackData) timeInfo.requestCancelTime = Date.now(); diff --git a/library/src/main/ets/model/ImageKnifeRequest.ets b/library/src/main/ets/model/ImageKnifeRequest.ets index 6e5db4e..ca5749c 100644 --- a/library/src/main/ets/model/ImageKnifeRequest.ets +++ b/library/src/main/ets/model/ImageKnifeRequest.ets @@ -27,7 +27,7 @@ export class ImageKnifeRequest { ImageKnifeRequestCallback: ImageKnifeRequestCallback componentVersion: number = 0 headers: Map = new Map() - private imageCallBackData: ImageKnifeData | undefined = undefined; + imageKnifeData?: ImageKnifeData constructor(option: ImageKnifeOption, uIAbilityContext: common.UIAbilityContext, width: number, @@ -54,14 +54,6 @@ export class ImageKnifeRequest { } }) } - - setImageKnifeData(data: ImageKnifeData) { - this.imageCallBackData = data; - } - - getImageKnifeData(): ImageKnifeData | undefined { - return this.imageCallBackData - } } export enum ImageKnifeRequestState {