forked from floraachy/ImageKnife
1.更改存入running和pend running的策略,修复同一张图片因为展示尺寸不同重复下载问题
Signed-off-by: zhoulisheng1 <zhoulisheng1@huawei.com>
This commit is contained in:
parent
a5da43a82b
commit
bb547da285
|
@ -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<string, any>(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') {
|
||||
//进入三级缓存模型 本地资源不参与磁盘缓存
|
||||
|
|
Loading…
Reference in New Issue