From c5ff1753c6ba343a9c787e6a5bbb6c199fdb552b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=98593378212=40qq=2Ecom=E2=80=99?= <‘xinxin2.wang@epro.com.cn’> Date: Sun, 7 Apr 2024 12:44:23 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B7=B3=E8=BF=87=E7=BD=91=E7=BB=9C=EF=BC=8C?= =?UTF-8?q?=E4=BB=8E=E5=86=85=E5=AD=98=E4=B8=AD=E5=8F=96=E5=9B=BE=E7=89=87?= =?UTF-8?q?=EF=BC=8Cmd=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/ets/pages/testImageKnifeCache.ets | 26 ++- .../ets/components/imageknife/ImageKnife.ets | 177 ++++++++++-------- .../components/imageknife/RequestOption.ets | 1 + 3 files changed, 110 insertions(+), 94 deletions(-) diff --git a/entry/src/main/ets/pages/testImageKnifeCache.ets b/entry/src/main/ets/pages/testImageKnifeCache.ets index 752a482..ca4de4f 100644 --- a/entry/src/main/ets/pages/testImageKnifeCache.ets +++ b/entry/src/main/ets/pages/testImageKnifeCache.ets @@ -55,8 +55,11 @@ struct testImageKnifeCache { errorholderSrc: $r('app.media.icon_failed') }; - hasUrlCache(request: RequestOption) { - imageKnife?.isUrlExist(request).then((data: ImageKnifeData) => { + hasUrlCache(url: string, cacheType: CacheType = CacheType.Default, size: Size = { + width: 0, + height: 0 + }) { + imageKnife?.isUrlExist(url, cacheType, size).then((data: ImageKnifeData) => { clearTimeout(this.timeId); if (data.isPixelMap()) { if (data.drawPixelMap) { @@ -183,31 +186,26 @@ struct testImageKnifeCache { errorholderSrc: $r('app.media.icon_failed') } }) - } - Row() { Button('缓存图片') .onClick(() => { this.index_ = 1; - let request = new RequestOption(); - request.load(this.url) - .setImageViewSize(this.comSize) - .setCacheType(CacheType.Cache); - this.hasUrlCache(request); + this.hasUrlCache(this.url, CacheType.Cache, this.comSize); }) Button('磁盘图片') .onClick(() => { this.index_ = 2; - let request = new RequestOption(); - request.load(this.url) - .setImageViewSize(this.comSize) - .setCacheType(CacheType.Disk); - this.hasUrlCache(request); + this.hasUrlCache(this.url, CacheType.Disk, this.comSize); + }) + Button('默认') + .onClick(() => { + this.index_ = 2; + this.hasUrlCache(this.url); }) } diff --git a/library/src/main/ets/components/imageknife/ImageKnife.ets b/library/src/main/ets/components/imageknife/ImageKnife.ets index 62832ea..e7b0807 100644 --- a/library/src/main/ets/components/imageknife/ImageKnife.ets +++ b/library/src/main/ets/components/imageknife/ImageKnife.ets @@ -328,87 +328,103 @@ export class ImageKnife { return this.parseSource(request); } - - public isUrlExist(request: RequestOption): Promise { - + public isUrlExist(url: string, cacheType: CacheType = CacheType.Default, size: Size = { + width: 0, + height: 0 + }): Promise { return new Promise((resolve, reject) => { + let request = new RequestOption(); + request.load(url) + .setImageViewSize(size) + .setCacheType(cacheType); this.generateDataCacheKey(request); let loadComplete = (imageKnifeData: ImageKnifeData) => { resolve(imageKnifeData); } let loadError = (err ?: BusinessError | string) => { + if (request.cacheType == CacheType.Default) { + this.loadMemoryDiskIsUrl(request, loadComplete, loadError); + } reject(err); } - this.loadMemoryCacheAndDiskFrom(request, loadComplete, loadError); + + if (request.cacheType == CacheType.Cache) { + this.loadMemoryCacheIsUrl(request, loadComplete, loadError); + + } else if (request.cacheType == CacheType.Disk) { + this.loadMemoryDiskIsUrl(request, loadComplete, loadError); + } + else if (request.cacheType == CacheType.Default) { + this.loadMemoryCacheIsUrl(request, loadComplete, loadError); + } }) } - loadMemoryCacheAndDiskFrom(request: RequestOption, onComplete: (imageKnifeData: ImageKnifeData) => void | PromiseLike, onError: (err?: BusinessError | string) => void) { - if (request.cacheType == CacheType.Cache) { - - let cache = this.memoryCacheProxy.loadMemoryCache(request.generateCacheKey, true); - if (cache == null || typeof cache == 'undefined') { - onError("No data in cache!") - }else { - cache.waitSaveDisk = false; - //2.网络缓存有数据,返回 - onComplete(cache); - } - - }else if (request.cacheType == CacheType.Disk){ - let cached: ArrayBuffer = DiskLruCache.getFileCacheByFile(this.diskMemoryCache.getPath() as string, request.generateDataKey) as ArrayBuffer; - if (cached != null) { - let filetype: string | null = this.fileTypeUtil.getFileType(cached); - - if (filetype == null) { - onError('请检查数据源'); - return; - } - - if (!this.fileTypeUtil.isImage(cached)) { - onError('暂不支持的类型!类型=' + filetype); - } - - if (ImageKnifeData.GIF == filetype && !request.dontAnimateFlag) { - let gifParseImpl = new GIFParseImpl() - gifParseImpl.parseGifs(cached, (data?: GIFFrame[], err?: BusinessError | string) => { - if (err) { - onError(err) - } - LogUtil.log("gifProcess data is null:" + (data == null)); - if (!!data) { - let imageKnifeData = ImageKnifeData.createImageGIFFrame(ImageKnifeType.GIFFRAME, data); - LogUtil.log('gifProcess 生成gif 返回数据类型') - onComplete(imageKnifeData) - } else { - onError('Parse GIF callback data is null, you need check callback data!') - } - }) - - } else if (ImageKnifeData.SVG == filetype) { - let svgParseImpl = new SVGParseImpl() - let success = (value: PixelMap) => { - let imageKnifeData = ImageKnifeData.createImagePixelMap(ImageKnifeType.PIXELMAP, value); - onComplete(imageKnifeData); - } - svgParseImpl.parseSvg(request, cached, success, onError) - } else { - //5.磁盘有数据,解析错误返回onError - let success = (value: PixelMap) => { - let imageKnifeData = ImageKnifeData.createImagePixelMap(ImageKnifeType.PIXELMAP, value); - onComplete(imageKnifeData); - } - this.mParseImageUtil.parseImage(cached, success, onError) - } - - } else { - //6.磁盘无数据,返回onError - onError("No data in disk cache!") - } + loadMemoryCacheIsUrl(request: RequestOption, onComplete: (imageKnifeData: ImageKnifeData) => void | PromiseLike, onError: (err?: BusinessError | string) => void) { + let cache = this.memoryCacheProxy.loadMemoryCache(request.generateCacheKey, true); + if (cache == null || typeof cache == 'undefined') { + onError("No data in cache!") + } else { + cache.waitSaveDisk = false; + //2.网络缓存有数据,返回 + onComplete(cache); } } + loadMemoryDiskIsUrl(request: RequestOption, onComplete: (imageKnifeData: ImageKnifeData) => void | PromiseLike, onError: (err?: BusinessError | string) => void) { + let cached: ArrayBuffer = DiskLruCache.getFileCacheByFile(this.diskMemoryCache.getPath() as string, request.generateDataKey) as ArrayBuffer; + if (cached != null) { + let filetype: string | null = this.fileTypeUtil.getFileType(cached); + + if (filetype == null) { + onError('请检查数据源'); + return; + } + + if (!this.fileTypeUtil.isImage(cached)) { + onError('暂不支持的类型!类型=' + filetype); + } + + if (ImageKnifeData.GIF == filetype && !request.dontAnimateFlag) { + let gifParseImpl = new GIFParseImpl() + gifParseImpl.parseGifs(cached, (data?: GIFFrame[], err?: BusinessError | string) => { + if (err) { + onError(err) + } + LogUtil.log("gifProcess data is null:" + (data == null)); + if (!!data) { + let imageKnifeData = ImageKnifeData.createImageGIFFrame(ImageKnifeType.GIFFRAME, data); + LogUtil.log('gifProcess 生成gif 返回数据类型') + onComplete(imageKnifeData) + } else { + onError('Parse GIF callback data is null, you need check callback data!') + } + }) + + } else if (ImageKnifeData.SVG == filetype) { + let svgParseImpl = new SVGParseImpl() + let success = (value: PixelMap) => { + let imageKnifeData = ImageKnifeData.createImagePixelMap(ImageKnifeType.PIXELMAP, value); + onComplete(imageKnifeData); + } + svgParseImpl.parseSvg(request, cached, success, onError) + } else { + //5.磁盘有数据,解析错误返回onError + let success = (value: PixelMap) => { + let imageKnifeData = ImageKnifeData.createImagePixelMap(ImageKnifeType.PIXELMAP, value); + onComplete(imageKnifeData); + } + this.mParseImageUtil.parseImage(cached, success, onError) + } + + } else { + //6.磁盘无数据,返回onError + onError("No data in disk cache!") + } + + } + generateDataCacheKey(request: RequestOption) { let factories: EngineKeyInterface; @@ -693,7 +709,7 @@ export class ImageKnife { if ((typeof (data as PixelMap).isEditable) == 'boolean') { let imageKnifeData = ImageKnifeData.createImagePixelMap(ImageKnifeType.PIXELMAP, data as PixelMap); request.placeholderOnComplete(imageKnifeData) - this.memoryCacheProxy.putValue(request.placeholderCacheKey,imageKnifeData) + this.memoryCacheProxy.putValue(request.placeholderCacheKey, imageKnifeData) } else { request.placeholderOnError("request placeholder error") } @@ -701,7 +717,7 @@ export class ImageKnife { if ((typeof (data as PixelMap).isEditable) == 'boolean') { let imageKnifeData = ImageKnifeData.createImagePixelMap(ImageKnifeType.PIXELMAP, data as PixelMap); request.retryholderOnComplete(imageKnifeData) - this.memoryCacheProxy.putValue(request.retryholderCacheKey,imageKnifeData) + this.memoryCacheProxy.putValue(request.retryholderCacheKey, imageKnifeData) } else { request.retryholderOnError("request retryholder error") } @@ -709,7 +725,7 @@ export class ImageKnife { if ((typeof (data as PixelMap).isEditable) == 'boolean') { let imageKnifeData = ImageKnifeData.createImagePixelMap(ImageKnifeType.PIXELMAP, data as PixelMap); request.errorholderOnComplete(imageKnifeData) - this.memoryCacheProxy.putValue(request.errorholderCacheKey,imageKnifeData) + this.memoryCacheProxy.putValue(request.errorholderCacheKey, imageKnifeData) } else { request.errorholderOnError("request errorholder error") } @@ -718,13 +734,13 @@ export class ImageKnife { let imageKnifeData = ImageKnifeData.createImagePixelMap(ImageKnifeType.PIXELMAP, data as PixelMap); imageKnifeData.needSaveDisk = true; request.loadComplete(imageKnifeData) - this.memoryCacheProxy.putValue(request.generateCacheKey,imageKnifeData) + this.memoryCacheProxy.putValue(request.generateCacheKey, imageKnifeData) this.setDiskCache(request) } else if ((data as GIFFrame[]).length > 0) { let imageKnifeData = ImageKnifeData.createImageGIFFrame(ImageKnifeType.GIFFRAME, data as GIFFrame[]); imageKnifeData.needSaveDisk = true; request.loadComplete(imageKnifeData) - this.memoryCacheProxy.putValue(request.generateCacheKey,imageKnifeData) + this.memoryCacheProxy.putValue(request.generateCacheKey, imageKnifeData) this.setDiskCache(request) } else { request.loadError("request resources error") @@ -736,7 +752,7 @@ export class ImageKnife { } - private setDiskCache(request: RequestOption):void{ + private setDiskCache(request: RequestOption): void { try { // let diskMemoryCache = ImageKnifeGlobal.getInstance().getImageKnife()?.getDiskMemoryCache(); let dataArraybuffer: ArrayBuffer = DiskLruCache.getFileCacheByFile(this.diskMemoryCache.getPath() as string, request.generateDataKey) as ArrayBuffer; @@ -827,15 +843,16 @@ export class ImageKnife { if (cachedPath == null || cachedPath == "" || cachedPath == undefined) { let request = new RequestOption(); request.load(url) - .addListener({ callback: (err: BusinessError | string, data: ImageKnifeData) => { - if (err) { - reject(err) - } else { - let cachedPath = this.getDiskMemoryCache().getFileToPath(key); - resolve(cachedPath); + .addListener({ + callback: (err: BusinessError | string, data: ImageKnifeData) => { + if (err) { + reject(err) + } else { + let cachedPath = this.getDiskMemoryCache().getFileToPath(key); + resolve(cachedPath); + } + return false; } - return false; - } }) this.call(request); } else { diff --git a/library/src/main/ets/components/imageknife/RequestOption.ets b/library/src/main/ets/components/imageknife/RequestOption.ets index b46d2be..266cf84 100644 --- a/library/src/main/ets/components/imageknife/RequestOption.ets +++ b/library/src/main/ets/components/imageknife/RequestOption.ets @@ -65,6 +65,7 @@ export interface Size { } export enum CacheType { + Default, //缓存 Cache, //磁盘