跳过网络,从内存中取图片,md文档
This commit is contained in:
parent
179917f23b
commit
c5ff1753c6
|
@ -55,8 +55,11 @@ struct testImageKnifeCache {
|
|||
errorholderSrc: $r('app.media.icon_failed')
|
||||
};
|
||||
|
||||
hasUrlCache(request: RequestOption) {
|
||||
imageKnife?.isUrlExist(request).then((data: ImageKnifeData) => {
|
||||
hasUrlCache(url: string, cacheType: CacheType = CacheType.Default, size: Size = {
|
||||
width: 0,
|
||||
height: 0
|
||||
}) {
|
||||
imageKnife?.isUrlExist(url, cacheType, size).then((data: ImageKnifeData) => {
|
||||
clearTimeout(this.timeId);
|
||||
if (data.isPixelMap()) {
|
||||
if (data.drawPixelMap) {
|
||||
|
@ -183,31 +186,26 @@ struct testImageKnifeCache {
|
|||
errorholderSrc: $r('app.media.icon_failed')
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
|
||||
Row() {
|
||||
Button('缓存图片')
|
||||
.onClick(() => {
|
||||
this.index_ = 1;
|
||||
let request = new RequestOption();
|
||||
request.load(this.url)
|
||||
.setImageViewSize(this.comSize)
|
||||
.setCacheType(CacheType.Cache);
|
||||
this.hasUrlCache(request);
|
||||
this.hasUrlCache(this.url, CacheType.Cache, this.comSize);
|
||||
|
||||
})
|
||||
|
||||
Button('磁盘图片')
|
||||
.onClick(() => {
|
||||
this.index_ = 2;
|
||||
let request = new RequestOption();
|
||||
request.load(this.url)
|
||||
.setImageViewSize(this.comSize)
|
||||
.setCacheType(CacheType.Disk);
|
||||
this.hasUrlCache(request);
|
||||
this.hasUrlCache(this.url, CacheType.Disk, this.comSize);
|
||||
})
|
||||
|
||||
Button('默认')
|
||||
.onClick(() => {
|
||||
this.index_ = 2;
|
||||
this.hasUrlCache(this.url);
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
@ -328,87 +328,103 @@ export class ImageKnife {
|
|||
return this.parseSource(request);
|
||||
}
|
||||
|
||||
|
||||
public isUrlExist(request: RequestOption): Promise<ImageKnifeData> {
|
||||
|
||||
public isUrlExist(url: string, cacheType: CacheType = CacheType.Default, size: Size = {
|
||||
width: 0,
|
||||
height: 0
|
||||
}): Promise<ImageKnifeData> {
|
||||
return new Promise((resolve, reject) => {
|
||||
let request = new RequestOption();
|
||||
request.load(url)
|
||||
.setImageViewSize(size)
|
||||
.setCacheType(cacheType);
|
||||
this.generateDataCacheKey(request);
|
||||
let loadComplete = (imageKnifeData: ImageKnifeData) => {
|
||||
resolve(imageKnifeData);
|
||||
}
|
||||
let loadError = (err ?: BusinessError | string) => {
|
||||
if (request.cacheType == CacheType.Default) {
|
||||
this.loadMemoryDiskIsUrl(request, loadComplete, loadError);
|
||||
}
|
||||
reject(err);
|
||||
}
|
||||
this.loadMemoryCacheAndDiskFrom(request, loadComplete, loadError);
|
||||
|
||||
if (request.cacheType == CacheType.Cache) {
|
||||
this.loadMemoryCacheIsUrl(request, loadComplete, loadError);
|
||||
|
||||
} else if (request.cacheType == CacheType.Disk) {
|
||||
this.loadMemoryDiskIsUrl(request, loadComplete, loadError);
|
||||
}
|
||||
else if (request.cacheType == CacheType.Default) {
|
||||
this.loadMemoryCacheIsUrl(request, loadComplete, loadError);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
loadMemoryCacheAndDiskFrom(request: RequestOption, onComplete: (imageKnifeData: ImageKnifeData) => void | PromiseLike<ImageKnifeData>, onError: (err?: BusinessError | string) => void) {
|
||||
|
||||
if (request.cacheType == CacheType.Cache) {
|
||||
|
||||
let cache = this.memoryCacheProxy.loadMemoryCache(request.generateCacheKey, true);
|
||||
if (cache == null || typeof cache == 'undefined') {
|
||||
onError("No data in cache!")
|
||||
}else {
|
||||
cache.waitSaveDisk = false;
|
||||
//2.网络缓存有数据,返回
|
||||
onComplete(cache);
|
||||
}
|
||||
|
||||
}else if (request.cacheType == CacheType.Disk){
|
||||
let cached: ArrayBuffer = DiskLruCache.getFileCacheByFile(this.diskMemoryCache.getPath() as string, request.generateDataKey) as ArrayBuffer;
|
||||
if (cached != null) {
|
||||
let filetype: string | null = this.fileTypeUtil.getFileType(cached);
|
||||
|
||||
if (filetype == null) {
|
||||
onError('请检查数据源');
|
||||
return;
|
||||
}
|
||||
|
||||
if (!this.fileTypeUtil.isImage(cached)) {
|
||||
onError('暂不支持的类型!类型=' + filetype);
|
||||
}
|
||||
|
||||
if (ImageKnifeData.GIF == filetype && !request.dontAnimateFlag) {
|
||||
let gifParseImpl = new GIFParseImpl()
|
||||
gifParseImpl.parseGifs(cached, (data?: GIFFrame[], err?: BusinessError | string) => {
|
||||
if (err) {
|
||||
onError(err)
|
||||
}
|
||||
LogUtil.log("gifProcess data is null:" + (data == null));
|
||||
if (!!data) {
|
||||
let imageKnifeData = ImageKnifeData.createImageGIFFrame(ImageKnifeType.GIFFRAME, data);
|
||||
LogUtil.log('gifProcess 生成gif 返回数据类型')
|
||||
onComplete(imageKnifeData)
|
||||
} else {
|
||||
onError('Parse GIF callback data is null, you need check callback data!')
|
||||
}
|
||||
})
|
||||
|
||||
} else if (ImageKnifeData.SVG == filetype) {
|
||||
let svgParseImpl = new SVGParseImpl()
|
||||
let success = (value: PixelMap) => {
|
||||
let imageKnifeData = ImageKnifeData.createImagePixelMap(ImageKnifeType.PIXELMAP, value);
|
||||
onComplete(imageKnifeData);
|
||||
}
|
||||
svgParseImpl.parseSvg(request, cached, success, onError)
|
||||
} else {
|
||||
//5.磁盘有数据,解析错误返回onError
|
||||
let success = (value: PixelMap) => {
|
||||
let imageKnifeData = ImageKnifeData.createImagePixelMap(ImageKnifeType.PIXELMAP, value);
|
||||
onComplete(imageKnifeData);
|
||||
}
|
||||
this.mParseImageUtil.parseImage(cached, success, onError)
|
||||
}
|
||||
|
||||
} else {
|
||||
//6.磁盘无数据,返回onError
|
||||
onError("No data in disk cache!")
|
||||
}
|
||||
loadMemoryCacheIsUrl(request: RequestOption, onComplete: (imageKnifeData: ImageKnifeData) => void | PromiseLike<ImageKnifeData>, onError: (err?: BusinessError | string) => void) {
|
||||
let cache = this.memoryCacheProxy.loadMemoryCache(request.generateCacheKey, true);
|
||||
if (cache == null || typeof cache == 'undefined') {
|
||||
onError("No data in cache!")
|
||||
} else {
|
||||
cache.waitSaveDisk = false;
|
||||
//2.网络缓存有数据,返回
|
||||
onComplete(cache);
|
||||
}
|
||||
}
|
||||
|
||||
loadMemoryDiskIsUrl(request: RequestOption, onComplete: (imageKnifeData: ImageKnifeData) => void | PromiseLike<ImageKnifeData>, onError: (err?: BusinessError | string) => void) {
|
||||
let cached: ArrayBuffer = DiskLruCache.getFileCacheByFile(this.diskMemoryCache.getPath() as string, request.generateDataKey) as ArrayBuffer;
|
||||
if (cached != null) {
|
||||
let filetype: string | null = this.fileTypeUtil.getFileType(cached);
|
||||
|
||||
if (filetype == null) {
|
||||
onError('请检查数据源');
|
||||
return;
|
||||
}
|
||||
|
||||
if (!this.fileTypeUtil.isImage(cached)) {
|
||||
onError('暂不支持的类型!类型=' + filetype);
|
||||
}
|
||||
|
||||
if (ImageKnifeData.GIF == filetype && !request.dontAnimateFlag) {
|
||||
let gifParseImpl = new GIFParseImpl()
|
||||
gifParseImpl.parseGifs(cached, (data?: GIFFrame[], err?: BusinessError | string) => {
|
||||
if (err) {
|
||||
onError(err)
|
||||
}
|
||||
LogUtil.log("gifProcess data is null:" + (data == null));
|
||||
if (!!data) {
|
||||
let imageKnifeData = ImageKnifeData.createImageGIFFrame(ImageKnifeType.GIFFRAME, data);
|
||||
LogUtil.log('gifProcess 生成gif 返回数据类型')
|
||||
onComplete(imageKnifeData)
|
||||
} else {
|
||||
onError('Parse GIF callback data is null, you need check callback data!')
|
||||
}
|
||||
})
|
||||
|
||||
} else if (ImageKnifeData.SVG == filetype) {
|
||||
let svgParseImpl = new SVGParseImpl()
|
||||
let success = (value: PixelMap) => {
|
||||
let imageKnifeData = ImageKnifeData.createImagePixelMap(ImageKnifeType.PIXELMAP, value);
|
||||
onComplete(imageKnifeData);
|
||||
}
|
||||
svgParseImpl.parseSvg(request, cached, success, onError)
|
||||
} else {
|
||||
//5.磁盘有数据,解析错误返回onError
|
||||
let success = (value: PixelMap) => {
|
||||
let imageKnifeData = ImageKnifeData.createImagePixelMap(ImageKnifeType.PIXELMAP, value);
|
||||
onComplete(imageKnifeData);
|
||||
}
|
||||
this.mParseImageUtil.parseImage(cached, success, onError)
|
||||
}
|
||||
|
||||
} else {
|
||||
//6.磁盘无数据,返回onError
|
||||
onError("No data in disk cache!")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
generateDataCacheKey(request: RequestOption) {
|
||||
let factories: EngineKeyInterface;
|
||||
|
@ -693,7 +709,7 @@ export class ImageKnife {
|
|||
if ((typeof (data as PixelMap).isEditable) == 'boolean') {
|
||||
let imageKnifeData = ImageKnifeData.createImagePixelMap(ImageKnifeType.PIXELMAP, data as PixelMap);
|
||||
request.placeholderOnComplete(imageKnifeData)
|
||||
this.memoryCacheProxy.putValue(request.placeholderCacheKey,imageKnifeData)
|
||||
this.memoryCacheProxy.putValue(request.placeholderCacheKey, imageKnifeData)
|
||||
} else {
|
||||
request.placeholderOnError("request placeholder error")
|
||||
}
|
||||
|
@ -701,7 +717,7 @@ export class ImageKnife {
|
|||
if ((typeof (data as PixelMap).isEditable) == 'boolean') {
|
||||
let imageKnifeData = ImageKnifeData.createImagePixelMap(ImageKnifeType.PIXELMAP, data as PixelMap);
|
||||
request.retryholderOnComplete(imageKnifeData)
|
||||
this.memoryCacheProxy.putValue(request.retryholderCacheKey,imageKnifeData)
|
||||
this.memoryCacheProxy.putValue(request.retryholderCacheKey, imageKnifeData)
|
||||
} else {
|
||||
request.retryholderOnError("request retryholder error")
|
||||
}
|
||||
|
@ -709,7 +725,7 @@ export class ImageKnife {
|
|||
if ((typeof (data as PixelMap).isEditable) == 'boolean') {
|
||||
let imageKnifeData = ImageKnifeData.createImagePixelMap(ImageKnifeType.PIXELMAP, data as PixelMap);
|
||||
request.errorholderOnComplete(imageKnifeData)
|
||||
this.memoryCacheProxy.putValue(request.errorholderCacheKey,imageKnifeData)
|
||||
this.memoryCacheProxy.putValue(request.errorholderCacheKey, imageKnifeData)
|
||||
} else {
|
||||
request.errorholderOnError("request errorholder error")
|
||||
}
|
||||
|
@ -718,13 +734,13 @@ export class ImageKnife {
|
|||
let imageKnifeData = ImageKnifeData.createImagePixelMap(ImageKnifeType.PIXELMAP, data as PixelMap);
|
||||
imageKnifeData.needSaveDisk = true;
|
||||
request.loadComplete(imageKnifeData)
|
||||
this.memoryCacheProxy.putValue(request.generateCacheKey,imageKnifeData)
|
||||
this.memoryCacheProxy.putValue(request.generateCacheKey, imageKnifeData)
|
||||
this.setDiskCache(request)
|
||||
} else if ((data as GIFFrame[]).length > 0) {
|
||||
let imageKnifeData = ImageKnifeData.createImageGIFFrame(ImageKnifeType.GIFFRAME, data as GIFFrame[]);
|
||||
imageKnifeData.needSaveDisk = true;
|
||||
request.loadComplete(imageKnifeData)
|
||||
this.memoryCacheProxy.putValue(request.generateCacheKey,imageKnifeData)
|
||||
this.memoryCacheProxy.putValue(request.generateCacheKey, imageKnifeData)
|
||||
this.setDiskCache(request)
|
||||
} else {
|
||||
request.loadError("request resources error")
|
||||
|
@ -736,7 +752,7 @@ export class ImageKnife {
|
|||
|
||||
}
|
||||
|
||||
private setDiskCache(request: RequestOption):void{
|
||||
private setDiskCache(request: RequestOption): void {
|
||||
try {
|
||||
// let diskMemoryCache = ImageKnifeGlobal.getInstance().getImageKnife()?.getDiskMemoryCache();
|
||||
let dataArraybuffer: ArrayBuffer = DiskLruCache.getFileCacheByFile(this.diskMemoryCache.getPath() as string, request.generateDataKey) as ArrayBuffer;
|
||||
|
@ -827,15 +843,16 @@ export class ImageKnife {
|
|||
if (cachedPath == null || cachedPath == "" || cachedPath == undefined) {
|
||||
let request = new RequestOption();
|
||||
request.load(url)
|
||||
.addListener({ callback: (err: BusinessError | string, data: ImageKnifeData) => {
|
||||
if (err) {
|
||||
reject(err)
|
||||
} else {
|
||||
let cachedPath = this.getDiskMemoryCache().getFileToPath(key);
|
||||
resolve(cachedPath);
|
||||
.addListener({
|
||||
callback: (err: BusinessError | string, data: ImageKnifeData) => {
|
||||
if (err) {
|
||||
reject(err)
|
||||
} else {
|
||||
let cachedPath = this.getDiskMemoryCache().getFileToPath(key);
|
||||
resolve(cachedPath);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
})
|
||||
this.call(request);
|
||||
} else {
|
||||
|
|
|
@ -65,6 +65,7 @@ export interface Size {
|
|||
}
|
||||
|
||||
export enum CacheType {
|
||||
Default,
|
||||
//缓存
|
||||
Cache,
|
||||
//磁盘
|
||||
|
|
Loading…
Reference in New Issue