1.更改存入running和pend running的策略,修复同一张图片因为展示尺寸不同重复下载问题

Signed-off-by: zhoulisheng1 <zhoulisheng1@huawei.com>
This commit is contained in:
zhoulisheng1 2023-05-06 10:10:54 +08:00
parent a5da43a82b
commit bb547da285
1 changed files with 65 additions and 41 deletions

View File

@ -277,7 +277,7 @@ export class ImageKnife {
for (let i = 0; i < this.runningRequest.length; i++) { for (let i = 0; i < this.runningRequest.length; i++) {
let tempRunning = this.runningRequest[i]; let tempRunning = this.runningRequest[i];
if (this.keyEqual(request, tempRunning)) { if (this.keyEqual(request, tempRunning)) {
// 如果key相同 说明目前有任务正在执行我们记录下当前request 放入pendingRunning // 如果key相同 说明找到执行的request我们记录下当前request的index位置
index = i; index = i;
break; break;
} }
@ -296,20 +296,21 @@ export class ImageKnife {
} }
searchNextKeyToRun(){ searchNextKeyToRun(){
// 其次则寻找pending中第一个和running不重复的key // 其次则寻找pending中第一个和running不重复的requestOrKey
let index2 = -1; let index2 = -1;
for (let i = 0; i < this.pendingRequest.length; i++) { for (let i = 0; i < this.pendingRequest.length; i++) {
let temppending = this.pendingRequest[i]; let temppending = this.pendingRequest[i];
let hasKeyEqual = false; let hasKeyEqual = false;
for (let j = 0; j < this.runningRequest.length; j++) { for (let j = 0; j < this.runningRequest.length; j++) {
let temprunning = this.runningRequest[j]; let temprunning = this.runningRequest[j];
if (this.keyEqual(temppending, temprunning)) { if (this.requestOrKeyEqual(temppending, temprunning)) {
hasKeyEqual = true; hasKeyEqual = true;
break; break;
} }
} }
if (!hasKeyEqual) { if (!hasKeyEqual) {
index2 = i; index2 = i;
break;
} }
} }
if (index2 >= 0) { if (index2 >= 0) {
@ -328,7 +329,7 @@ export class ImageKnife {
let index = -1; let index = -1;
for (let i = 0; i < this.pendingRequest.length; i++) { for (let i = 0; i < this.pendingRequest.length; i++) {
let temppending = this.pendingRequest[i]; let temppending = this.pendingRequest[i];
if (this.keyEqual(request, temppending)) { if (this.requestOrKeyEqual(request, temppending)) {
// 如果key相同 说明目前有任务正在执行我们记录下当前request 放入pendingRunning // 如果key相同 说明目前有任务正在执行我们记录下当前request 放入pendingRunning
index = i; index = i;
break; break;
@ -347,9 +348,9 @@ export class ImageKnife {
let hasRunningRequest = false; let hasRunningRequest = false;
for (let i = 0; i < this.runningRequest.length; i++) { for (let i = 0; i < this.runningRequest.length; i++) {
let tempRunning = this.runningRequest[i]; let tempRunning = this.runningRequest[i];
if (this.keyEqual(request, tempRunning)) { if (this.requestOrKeyEqual(request, tempRunning)) {
// 如果key相同 说明目前有任务正在执行我们记录下当前request 放入pendingRunning // 如果requestOrKey相同 说明目前有任务正在执行我们记录下当前request 放入pendingRunning
hasRunningRequest = true; hasRunningRequest = true;
break; break;
} }
@ -381,6 +382,7 @@ export class ImageKnife {
} }
private keyEqual(request1: RequestOption, request2: RequestOption): boolean{ private keyEqual(request1: RequestOption, request2: RequestOption): boolean{
// key 完全相等的情况
if ( if (
request1.generateCacheKey == request2.generateCacheKey && request1.generateCacheKey == request2.generateCacheKey &&
request1.generateResourceKey == request2.generateResourceKey && request1.generateResourceKey == request2.generateResourceKey &&
@ -388,6 +390,28 @@ export class ImageKnife {
) { ) {
return true; 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; return false;
} }