From bb547da28531f4454124b445b1d4cea2a60298ad Mon Sep 17 00:00:00 2001 From: zhoulisheng1 Date: Sat, 6 May 2023 10:10:54 +0800 Subject: [PATCH] =?UTF-8?q?1.=E6=9B=B4=E6=94=B9=E5=AD=98=E5=85=A5running?= =?UTF-8?q?=E5=92=8Cpend=20running=E7=9A=84=E7=AD=96=E7=95=A5,=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=90=8C=E4=B8=80=E5=BC=A0=E5=9B=BE=E7=89=87=E5=9B=A0?= =?UTF-8?q?=E4=B8=BA=E5=B1=95=E7=A4=BA=E5=B0=BA=E5=AF=B8=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E4=B8=8B=E8=BD=BD=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhoulisheng1 --- .../ets/components/imageknife/ImageKnife.ets | 106 +++++++++++------- 1 file changed, 65 insertions(+), 41 deletions(-) diff --git a/imageknife/src/main/ets/components/imageknife/ImageKnife.ets b/imageknife/src/main/ets/components/imageknife/ImageKnife.ets index 313dc16..a8a6ede 100644 --- a/imageknife/src/main/ets/components/imageknife/ImageKnife.ets +++ b/imageknife/src/main/ets/components/imageknife/ImageKnife.ets @@ -107,7 +107,7 @@ export class ImageKnife { }; setDiskMemoryCache(diskLruCache: DiskLruCache) { - this.diskMemoryCache = diskLruCache; + this.diskMemoryCache = diskLruCache; }; getFileTypeUtil(): FileTypeUtil{ @@ -130,7 +130,7 @@ export class ImageKnife { this.gifWorker = worker } getGifWorker(){ - return this.gifWorker; + return this.gifWorker; } getDefaultLifeCycle(){ @@ -162,7 +162,7 @@ export class ImageKnife { }else{ let newLruCache = new LruCache(size); this.memoryCache.foreachLruCache(function (value, key, map) { - newLruCache.put(key, value); + newLruCache.put(key, value); }) this.memoryCache = newLruCache; } @@ -277,7 +277,7 @@ export class ImageKnife { for (let i = 0; i < this.runningRequest.length; i++) { let tempRunning = this.runningRequest[i]; if (this.keyEqual(request, tempRunning)) { - // 如果key相同 说明目前有任务正在执行,我们记录下当前request 放入pendingRunning + // 如果key相同 说明找到执行的request,我们记录下当前request的index位置 index = i; break; } @@ -290,35 +290,36 @@ export class ImageKnife { // 执行相同key的pending队列请求 keyEqualPendingToRun(index:number){ - let nextPending = this.pendingRequest.splice(index, 1)[0]; - this.runningRequest.push(nextPending) - RequestManager.execute((nextPending as RequestOption), this.memoryCache, this.diskMemoryCache, this.dataFetch, this.resourceFetch) + let nextPending = this.pendingRequest.splice(index, 1)[0]; + this.runningRequest.push(nextPending) + RequestManager.execute((nextPending as RequestOption), this.memoryCache, this.diskMemoryCache, this.dataFetch, this.resourceFetch) } searchNextKeyToRun(){ - // 其次则寻找pending中第一个和running不重复的key - let index2 = -1; - for (let i = 0; i < this.pendingRequest.length; i++) { - let temppending = this.pendingRequest[i]; - let hasKeyEqual = false; - for (let j = 0; j < this.runningRequest.length; j++) { - let temprunning = this.runningRequest[j]; - if (this.keyEqual(temppending, temprunning)) { - hasKeyEqual = true; - break; - } - } - if (!hasKeyEqual) { - index2 = i; + // 其次则寻找pending中第一个和running不重复的requestOrKey + let index2 = -1; + for (let i = 0; i < this.pendingRequest.length; i++) { + let temppending = this.pendingRequest[i]; + let hasKeyEqual = false; + for (let j = 0; j < this.runningRequest.length; j++) { + let temprunning = this.runningRequest[j]; + if (this.requestOrKeyEqual(temppending, temprunning)) { + hasKeyEqual = true; + break; } } - if (index2 >= 0) { - let nextPending = this.pendingRequest.splice(index2, 1)[0]; - this.runningRequest.push(nextPending) - RequestManager.execute((nextPending as RequestOption), this.memoryCache, this.diskMemoryCache, this.dataFetch, this.resourceFetch) - } else { - // 不执行 + if (!hasKeyEqual) { + index2 = i; + break; } + } + if (index2 >= 0) { + let nextPending = this.pendingRequest.splice(index2, 1)[0]; + this.runningRequest.push(nextPending) + RequestManager.execute((nextPending as RequestOption), this.memoryCache, this.diskMemoryCache, this.dataFetch, this.resourceFetch) + } else { + // 不执行 + } } @@ -328,16 +329,16 @@ export class ImageKnife { let index = -1; for (let i = 0; i < this.pendingRequest.length; i++) { let temppending = this.pendingRequest[i]; - if (this.keyEqual(request, temppending)) { + if (this.requestOrKeyEqual(request, temppending)) { // 如果key相同 说明目前有任务正在执行,我们记录下当前request 放入pendingRunning index = i; break; } } if (index >= 0) { - this.keyEqualPendingToRun(index); + this.keyEqualPendingToRun(index); } else { - this.searchNextKeyToRun(); + this.searchNextKeyToRun(); } } @@ -347,9 +348,9 @@ export class ImageKnife { let hasRunningRequest = false; for (let i = 0; i < this.runningRequest.length; i++) { let tempRunning = this.runningRequest[i]; - if (this.keyEqual(request, tempRunning)) { + if (this.requestOrKeyEqual(request, tempRunning)) { - // 如果key相同 说明目前有任务正在执行,我们记录下当前request 放入pendingRunning + // 如果requestOrKey相同 说明目前有任务正在执行,我们记录下当前request 放入pendingRunning hasRunningRequest = true; break; } @@ -371,9 +372,9 @@ export class ImageKnife { private keyNotEmpty(request: RequestOption): boolean{ if ( - request.generateCacheKey != null && request.generateCacheKey.length > 0 && - request.generateDataKey != null && request.generateDataKey.length > 0 && - request.generateResourceKey != null && request.generateResourceKey.length > 0 + request.generateCacheKey != null && request.generateCacheKey.length > 0 && + request.generateDataKey != null && request.generateDataKey.length > 0 && + request.generateResourceKey != null && request.generateResourceKey.length > 0 ) { return true; } @@ -381,13 +382,36 @@ export class ImageKnife { } private keyEqual(request1: RequestOption, request2: RequestOption): boolean{ + // key 完全相等的情况 if ( - request1.generateCacheKey == request2.generateCacheKey && - request1.generateResourceKey == request2.generateResourceKey && - request1.generateDataKey == request2.generateDataKey + request1.generateCacheKey == request2.generateCacheKey && + request1.generateResourceKey == request2.generateResourceKey && + request1.generateDataKey == request2.generateDataKey ) { return true; } + + return false; + } + + // 非严格校验模式,如果所有key相等我们认为一定相等, 如果请求类型是string 网络请求url或者uri相等 我们也认为该请求应该只发送一个即可,后续请求会去缓存或者磁盘读取 + private requestOrKeyEqual(request1: RequestOption, request2: RequestOption): boolean{ + // key 完全相等的情况 + if ( + request1.generateCacheKey == request2.generateCacheKey && + request1.generateResourceKey == request2.generateResourceKey && + request1.generateDataKey == request2.generateDataKey + ) { + return true; + } + + // 如果加载的是网络url或者是本地文件uri读取,那么loadSrc相同就认为是同一个请求 + if( + typeof request1.loadSrc == 'string' && typeof request2.loadSrc == 'string' && request1.loadSrc == request2.loadSrc + ) { + return true; + } + return false; } @@ -397,9 +421,9 @@ export class ImageKnife { request.loadComplete(imageKnifeData); } else if (typeof request.loadSrc == 'string') { - // 进入三级缓存模型 - return this.loadResources(request); - } else { + // 进入三级缓存模型 + return this.loadResources(request); + } else { let res = request.loadSrc as Resource; if (typeof res.id != 'undefined' && typeof res.type != 'undefined') { //进入三级缓存模型 本地资源不参与磁盘缓存