1.补充Imageknife相关public接口

2.支持文件路径支持设置非context.cacheDir的路径

Signed-off-by: madixin <madixin@huawei.com>
This commit is contained in:
madixin 2024-06-27 09:42:57 +08:00
parent 2c54685897
commit 3fa2d61b6e
2 changed files with 91 additions and 80 deletions

View File

@ -20,7 +20,6 @@ import { FileCache } from './utils/FileCache';
import { ImageKnifeDispatcher } from './ImageKnifeDispatcher';
import { IEngineKey } from './key/IEngineKey';
import { HeaderOptions, ImageKnifeOption } from './ImageKnifeOption';
import { DefaultEngineKey } from './key/DefaultEngineKey';
import { FileTypeUtil } from './utils/FileTypeUtil';
import { util } from '@kit.ArkTS';
import { image } from '@kit.ImageKit';
@ -37,8 +36,8 @@ export class ImageKnife {
private dispatcher: ImageKnifeDispatcher = new ImageKnifeDispatcher()
// 配置全局是否在子线程加载图片请求
private _isRequestInSubThread: boolean = true;
headerMap: Map<string, Object> = new Map<string, Object>(); //定义全局map
//定义全局网络请求header map
headerMap: Map<string, Object> = new Map<string, Object>();
public static getInstance(): ImageKnife {
if (!ImageKnife.instance) {
@ -58,12 +57,12 @@ export class ImageKnife {
return this._isRequestInSubThread;
}
/**
* 初始化文件缓存
* 初始化文件缓存个数,大小,以及路径
* @param context 上下文
* @param size 缓存数量
* @param memory 内存大小
* @param path 文件目录
*/
async initFileCache(context: Context, size: number = 256, memory: number = 256 * 1024 * 1024,path?: string) {
this.fileCache = new FileCache(context, size, memory)
@ -75,7 +74,7 @@ export class ImageKnife {
}
/**
* 判断文件缓存是否初始化
* 判断文件缓存是否已完成初始化
* @returns 是否初始化
*/
public isFileCacheInit(): boolean {
@ -83,16 +82,16 @@ export class ImageKnife {
}
/**
* 全局添加单个请求头
* 全局添加单个请求头header
* @param key 请求头属性
* @param value 请求头值
*/
addHeader(key: string, value: Object) {
this.headerMap.set(key, value);
this.headerMap.set(key, value)
}
/**
* 全局设置请求头调用方法
* 全局设置请求头header
* @param options 请求头数组
*/
serHeaderOptions(options: Array<HeaderOptions>) {
@ -102,11 +101,11 @@ export class ImageKnife {
}
/**
* 删除单个请求头属性
* 删除单个请求头header
* @param key 请求头属性
*/
deleteHeader(key: string) {
this.headerMap.delete(key);
this.headerMap.delete(key)
}
/**
@ -114,7 +113,7 @@ export class ImageKnife {
* @param newMemoryCache 自定义内存缓存
*/
initMemoryCache(newMemoryCache: IMemoryCache): void {
this.memoryCache
this.memoryCache = newMemoryCache
}
/**
@ -123,9 +122,11 @@ export class ImageKnife {
removeAllMemoryCache(): void {
this.memoryCache.removeAll()
}
/*
/**
* 清除指定内存缓存
* */
* @param url 待清除的url路径或ImageKnifeOption
*/
removeMemoryCache(url: string | ImageKnifeOption) {
let imageKnifeOption = new ImageKnifeOption();
if (typeof url == 'string') {
@ -137,33 +138,9 @@ export class ImageKnife {
this.memoryCache.remove(key);
}
loadFromMemoryCache(key: string): ImageKnifeData | undefined {
if (key !== "") {
return this.memoryCache.get(key)
}
return undefined
}
saveMemoryCache(key: string, data: ImageKnifeData): void {
if (key !== "") {
this.memoryCache.put(key, data)
}
}
loadFromFileCache(key: string): ArrayBuffer | undefined {
return this.fileCache?.get(key)
}
saveFileCache(key: string, data: ArrayBuffer): void {
this.fileCache?.put(key, data)
}
getFileCache(): FileCache {
return this.fileCache as FileCache
}
/**
* 预加载到文件缓存
* 预加载图片到文件缓存
* @param loadSrc 图片地址url
* @returns 返回文件缓存路径
*/
@ -233,7 +210,7 @@ export class ImageKnife {
}
/**
*
* 预加载缓存用于外部已获取pixelmap需要加入imageknife缓存的场景
* @param url 图片地址url
* @param pixelMap 图片
* @param cacheType 缓存策略
@ -258,6 +235,74 @@ export class ImageKnife {
}
}
/**
* 清除所有文件缓存
* @returns
*/
async removeAllFileCache(): Promise<void> {
if (this.fileCache !== undefined) {
await this.fileCache.removeAll()
}
}
/*
* 清除指定文件缓存
* */
removeFileCache(url: string | ImageKnifeOption) {
let imageKnifeOption: ImageKnifeOption;
if (url instanceof ImageKnifeOption) {
imageKnifeOption = url;
} else {
imageKnifeOption = {
loadSrc: url
};
}
let key = this.getEngineKeyImpl().generateFileKey(imageKnifeOption.loadSrc, imageKnifeOption.signature);
if (this.fileCache !== undefined) {
this.fileCache.remove(key);
}
}
/**
* 设置taskpool默认并发数量
* @param concurrency 默认并发数量默认为8
*/
setMaxRequests(concurrency: number): void {
this.dispatcher.setMaxRequests(concurrency)
}
getFileCacheByFile(context: Context, key: string): ArrayBuffer | undefined {
if (this.fileCache !== undefined) {
return FileCache.getFileCacheByFile(context, key)
}
return undefined
}
loadFromMemoryCache(key: string): ImageKnifeData | undefined {
if (key !== "") {
return this.memoryCache.get(key)
}
return undefined
}
saveMemoryCache(key: string, data: ImageKnifeData): void {
if (key !== "") {
this.memoryCache.put(key, data)
}
}
loadFromFileCache(key: string): ArrayBuffer | undefined {
return this.fileCache?.get(key)
}
saveFileCache(key: string, data: ArrayBuffer): void {
this.fileCache?.put(key, data)
}
getFileCache(): FileCache {
return this.fileCache as FileCache
}
private pixelMapToArrayBuffer(pixelMap: PixelMap): ArrayBuffer {
let imageInfo = pixelMap.getImageInfoSync();
let readBuffer: ArrayBuffer = new ArrayBuffer(imageInfo.size.height * imageInfo.size.width * 4);
@ -308,33 +353,6 @@ export class ImageKnife {
}
}
/**
* 清除所有文件缓存
* @returns
*/
async removeAllFileCache(): Promise<void> {
if (this.fileCache !== undefined) {
await this.fileCache.removeAll()
}
}
/*
* 清除指定文件缓存
* */
removeFileCache(url: string | ImageKnifeOption) {
let imageKnifeOption: ImageKnifeOption;
if (url instanceof ImageKnifeOption) {
imageKnifeOption = url;
} else {
imageKnifeOption = {
loadSrc: url
};
}
let key = this.getEngineKeyImpl().generateFileKey(imageKnifeOption.loadSrc, imageKnifeOption.signature);
if (this.fileCache !== undefined) {
this.fileCache.remove(key);
}
}
saveWithoutWriteFile(key: string, bufferSize: number): void {
this.fileCache?.putWithoutWriteFile(key, bufferSize)
}
@ -346,13 +364,6 @@ export class ImageKnife {
return false
}
getFileCacheByFile(context: Context, key: string): ArrayBuffer | undefined {
if (this.fileCache !== undefined) {
return FileCache.getFileCacheByFile(context, key)
}
return undefined
}
async execute(request: ImageKnifeRequest): Promise<void> {
LogUtil.log("ImageKnife_DataTime_execute.start:"+request.imageKnifeOption.loadSrc)
if (this.headerMap.size > 0) {
@ -362,10 +373,6 @@ export class ImageKnife {
LogUtil.log("ImageKnife_DataTime_execute.end:"+request.imageKnifeOption.loadSrc)
}
setMaxRequests(concurrency: number): void {
this.dispatcher.setMaxRequests(concurrency)
}
setEngineKeyImpl(impl: IEngineKey): void {
this.dispatcher.setEngineKeyImpl(impl);
}

View File

@ -60,8 +60,12 @@ export class FileCache {
if (this.isInited) {
return
}
FileCache.CACHE_FOLDER = path
this.path = this.context?.cacheDir + FileUtils.SEPARATOR + FileCache.CACHE_FOLDER + FileUtils.SEPARATOR
if (this.context && path.startsWith(this.context.cacheDir) === false) {
this.path = path
} else {
FileCache.CACHE_FOLDER = path
this.path = this.context?.cacheDir + FileUtils.SEPARATOR + FileCache.CACHE_FOLDER + FileUtils.SEPARATOR
}
await FileUtils.getInstance().createFolder(this.path)
// 遍历缓存目录下的文件,按照时间顺序加入缓存
let filenames: string[] = await FileUtils.getInstance().ListFile(this.path)