1.taskpool执行异常时,回调onLoadFailed

2.调整imageKnifeData为public作用域,以及命名

Signed-off-by: madixin <madixin@huawei.com>
This commit is contained in:
madixin 2024-11-15 12:17:52 +08:00
parent a45fb6af7d
commit 328257bb96
8 changed files with 80 additions and 57 deletions

View File

@ -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

View File

@ -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 },

View File

@ -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;

View File

@ -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 },

View File

@ -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);

View File

@ -53,10 +53,10 @@ export default function loadCallBackData() {
await new Promise<string>((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)
}
}

View File

@ -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();

View File

@ -27,7 +27,7 @@ export class ImageKnifeRequest {
ImageKnifeRequestCallback: ImageKnifeRequestCallback
componentVersion: number = 0
headers: Map<string,Object> = new Map<string,Object>()
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 {