From d674f6c40991158b35616e62125ea99cc7e5042f 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: Tue, 19 Mar 2024 16:24:51 +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?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ets/components/imageknife/ImageKnife.ets | 126 ++++++++++++++++-- 1 file changed, 115 insertions(+), 11 deletions(-) diff --git a/library/src/main/ets/components/imageknife/ImageKnife.ets b/library/src/main/ets/components/imageknife/ImageKnife.ets index 85568e4..ca23d5c 100644 --- a/library/src/main/ets/components/imageknife/ImageKnife.ets +++ b/library/src/main/ets/components/imageknife/ImageKnife.ets @@ -41,6 +41,9 @@ import common from '@ohos.app.ability.common' import HashMap from '@ohos.util.HashMap' import LinkedList from '@ohos.util.LinkedList' import { MemoryLruCache } from '../cache/MemoryLruCache' +import { BusinessError } from '@ohos.base' +import { IParseImage } from './interface/IParseImage' +import { ParseImageUtil } from './utils/ParseImageUtil' export class ImageKnife { static readonly SEPARATOR: string = '/' @@ -70,15 +73,16 @@ export class ImageKnife { defaultLifeCycle: IDrawLifeCycle | undefined = undefined; // 开发者可配置全局缓存 engineKeyImpl: EngineKeyInterface; + private mParseImageUtil: IParseImage; private constructor() { - + this.mParseImageUtil = new ParseImageUtil(); this.runningMaps = new EasyLinkedHashMap(); this.pendingMaps = new EasyLinkedHashMap(); this.pausedMaps = new EasyLinkedHashMap(); // 构造方法传入size 为保存文件个数 - this.memoryCache = new MemoryLruCache(100,100*1024*1024); + this.memoryCache = new MemoryLruCache(100, 100 * 1024 * 1024); // 创建disk缓存 传入的size 为多少比特 比如20KB 传入20*1024 this.diskMemoryCache = DiskLruCache.create(ImageKnifeGlobal.getInstance().getHapContext()); @@ -99,6 +103,7 @@ export class ImageKnife { } + //全局设置请求头调用方法 addHeader(key: string, value: Object) { this.headerMap.set(key, value); @@ -184,11 +189,11 @@ export class ImageKnife { // 设置缓存张数,缓存大小,单位字节 - public setLruCacheSize(size: number,memory:number) { + public setLruCacheSize(size: number, memory: number) { if (this.memoryCache.map.size() <= 0) { - this.memoryCache = new MemoryLruCache(size,memory); + this.memoryCache = new MemoryLruCache(size, memory); } else { - let newLruCache = new MemoryLruCache(size,memory); + let newLruCache = new MemoryLruCache(size, memory); this.memoryCache.foreachLruCache((value: ImageKnifeData, key: string, map: Object) => { newLruCache.put(key, value); }) @@ -214,6 +219,106 @@ export class ImageKnife { // } } + + public isUrlExist(url: string): Promise { + + return new Promise((resolve, reject) => { + let request1 = new RequestOption(); + request1.loadSrc = url; + let request = this.loadResourcesCaches(request1); + + let loadComplete = (ImageKnifeData: ImageKnifeData) => { + let pixelMap: PixelMap | undefined; + pixelMap = ImageKnifeData?.drawPixelMap?.imagePixelMap; + resolve(pixelMap as PixelMap); + } + let loadError = (err ?: BusinessError | string) => { + reject(undefined); + } + this.loadMemoryCacheAndDiskFrom(request, loadComplete, loadError); + }) + } + + loadMemoryCacheAndDiskFrom(request: RequestOption, onComplate: (ImageKnifeData: ImageKnifeData) => void | PromiseLike, onError: (err?: BusinessError | string) => void) { + let cache = this.memoryCache.get(request.generateCacheKey); + if (cache == null || typeof cache == 'undefined') { + let cached = this.diskMemoryCache.get(request.generateDataKey); + if (cached == null) { + //4.加载磁盘缓存 原图 + cached = this.diskMemoryCache.get(request.generateResourceKey); + } + if (cached != null) { + //5.磁盘有数据,解析错误返回onError + let success = (value: PixelMap) => { + let imageKnifeData = ImageKnifeData.createImagePixelMap(ImageKnifeType.PIXELMAP, value); + this.memoryCache.put(request.generateCacheKey, imageKnifeData); + onComplate(imageKnifeData); + } + this.mParseImageUtil.parseImage(cached, success, onError) + } else { + //6.磁盘无数据,返回onError + onError("网络缓存and磁盘缓存无数据!") + } + } else { + //需要清理状态 + cache.waitSaveDisk = false; + //2.网络缓存有数据,返回 + onComplate(cache); + } + } + + loadResourcesCaches(request: RequestOption) { + let factories: EngineKeyInterface; + let cacheKey: string; + let transferKey: string; + let dataKey: string; + if (this.engineKeyImpl) { + factories = this.engineKeyImpl; + } else { + factories = new EngineKeyFactories(); + } + // 生成内存缓存key 内存 变换后磁盘 + + let loadKey = ''; + if (typeof request.loadSrc == 'string') { + loadKey = request.loadSrc; + } else { + loadKey = JSON.stringify(request.loadSrc); + } + + let size = JSON.stringify(request.size); + + let transformed = ''; + if (request && request.transformations) { + for (let i = 0; i < request.transformations.length; i++) { + if (i == request.transformations.length - 1) { + transformed += request.transformations[i].getName() + ""; + } else { + transformed += request.transformations[i].getName() + ","; + } + } + } + + let dontAnimateFlag = request.dontAnimateFlag; + + let signature = request.signature; + + cacheKey = factories.generateMemoryCacheKey(loadKey, size, transformed, dontAnimateFlag, signature); + + // 生成磁盘缓存变换后数据key 变换后数据保存在磁盘 + transferKey = factories.generateTransformedDiskCacheKey(loadKey, size, transformed, dontAnimateFlag, signature); + + // 生成磁盘缓存源数据key 原始数据保存在磁盘 + dataKey = factories.generateOriginalDiskCacheKey(loadKey, signature); + + request.generateCacheKey = cacheKey; + request.generateResourceKey = transferKey; + request.generateDataKey = dataKey; + + return request; + } + + // 预加载 resource资源一级缓存,string资源实现二级缓存 preload(request: RequestOption): void { // 每个request 公共信息补充 @@ -308,6 +413,7 @@ export class ImageKnife { return this.parseSource(request); } + loadResources(request: RequestOption) { let factories: EngineKeyInterface; let cacheKey: string; @@ -344,13 +450,13 @@ export class ImageKnife { let signature = request.signature; - cacheKey = factories.generateMemoryCacheKey(loadKey,size,transformed,dontAnimateFlag,signature); + cacheKey = factories.generateMemoryCacheKey(loadKey, size, transformed, dontAnimateFlag, signature); // 生成磁盘缓存变换后数据key 变换后数据保存在磁盘 - transferKey = factories.generateTransformedDiskCacheKey(loadKey,size,transformed,dontAnimateFlag,signature); + transferKey = factories.generateTransformedDiskCacheKey(loadKey, size, transformed, dontAnimateFlag, signature); // 生成磁盘缓存源数据key 原始数据保存在磁盘 - dataKey = factories.generateOriginalDiskCacheKey(loadKey,signature); + dataKey = factories.generateOriginalDiskCacheKey(loadKey, signature); request.generateCacheKey = cacheKey; request.generateResourceKey = transferKey; @@ -375,8 +481,6 @@ export class ImageKnife { private keyEqualPendingToRun(nextPending: RequestOption) { - - this.pendingMaps.remove(nextPending.uuid) this.runningMaps.put(nextPending.uuid, nextPending); @@ -428,7 +532,7 @@ export class ImageKnife { } if (hasEqualRunning) { - if(tailNode != null && tailNode.value != null) { + if (tailNode != null && tailNode.value != null) { this.keyEqualPendingToRun(tailNode.value); } } else {