解决单个图片解码后内存占用超过内存缓存最大值,导致无法显示图片的问题

Signed-off-by: madixin <madixin@huawei.com>
This commit is contained in:
madixin 2024-11-06 15:50:15 +08:00
parent b0661e83ac
commit 95ffcb9e74
1 changed files with 16 additions and 12 deletions

View File

@ -46,6 +46,11 @@ export class MemoryLruCache implements IMemoryCache {
throw new Error('key or value is invalid ');
}
let size = this.getImageKnifeDataSize(value)
if (size <= 0 && size >= this.maxMemory) {
return
}
// 如果size满了的话需要按照LRU的方式删除第一个
if (this.lruCache.length == this.maxSize && !this.lruCache.contains(key)) {
this.remove(this.lruCache.keys()[0])
@ -53,12 +58,9 @@ export class MemoryLruCache implements IMemoryCache {
this.remove(key)
}
let pre: ImageKnifeData = this.lruCache.put(key, value)
this.addMemorySize(value)
// if (pre !== undefined) { // 当前返回不是key的之前value
// this.removeMemorySize(pre)
// }
this.trimToSize();
this.lruCache.put(key, value)
this.currentMemory += size
this.trimToSize()
}
get(key: string): ImageKnifeData | undefined {
@ -119,19 +121,21 @@ export class MemoryLruCache implements IMemoryCache {
}
}
private addMemorySize(value: ImageKnifeData): void {
private getImageKnifeDataSize(value: ImageKnifeData): number {
if (value.source != undefined) {
if (typeof value.source === 'string' && value.source != "") {
this.currentMemory += value.source.length
return value.source.length
} else if (value.source == "") {
for (let index = 0;index < value.imageAnimator!.length;index++) {
let size: number = 0
for (let index = 0; index < value.imageAnimator!.length; index++) {
let pixelMap = value.imageAnimator![index].src as PixelMap
this.currentMemory += pixelMap.getPixelBytesNumber()
size += pixelMap.getPixelBytesNumber()
}
return size
} else {
this.currentMemory += value.source.getPixelBytesNumber();
return value.source.getPixelBytesNumber();
}
//LogUtil.log("MemoryCache addMemorySize: " + value.source.getPixelBytesNumber() + " currentMemory" + this.currentMemory)
}
return 0
}
}