From 0df4f8d6ef6aee5062249e875168a47ed9aff58b Mon Sep 17 00:00:00 2001 From: jiao123456f <843446918@qq.com> Date: Sat, 27 Apr 2024 15:08:03 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E8=A1=A5=E5=85=85=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E9=A2=84=E5=8A=A0=E8=BD=BD=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?prefetchToFileCache,=E4=BB=A5=E5=8F=8AImageKnifeOption=E5=B1=9E?= =?UTF-8?q?=E6=80=A7isCacheable=E3=80=81onlyRetrieveFromCache?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zgf8268 --- entry/src/main/ets/pages/Index.ets | 5 +++ entry/src/main/ets/pages/ListPage.ets | 6 +-- .../ets/pages/TestPrefetchToFileCache.ets | 42 +++++++++++++++++++ entry/src/main/ets/pages/User.ets | 4 +- .../resources/base/profile/main_pages.json | 3 +- library/src/main/ets/ImageKnife.ets | 37 ++++++++++++++++ library/src/main/ets/ImageKnifeDispatcher.ets | 21 +++++++--- library/src/main/ets/ImageKnifeOption.ets | 4 ++ library/src/main/ets/utils/FileCache.ets | 16 +++++++ 9 files changed, 127 insertions(+), 11 deletions(-) create mode 100644 entry/src/main/ets/pages/TestPrefetchToFileCache.ets diff --git a/entry/src/main/ets/pages/Index.ets b/entry/src/main/ets/pages/Index.ets index 71da2ac..018187e 100644 --- a/entry/src/main/ets/pages/Index.ets +++ b/entry/src/main/ets/pages/Index.ets @@ -62,7 +62,12 @@ struct Index { }); }) + Button("测试文件缓存预加载").onClick(()=>{ + router.push({ + uri: 'pages/TestPrefetchToFileCache', + }); + }) } .width('100%') diff --git a/entry/src/main/ets/pages/ListPage.ets b/entry/src/main/ets/pages/ListPage.ets index d74fbcf..da98504 100644 --- a/entry/src/main/ets/pages/ListPage.ets +++ b/entry/src/main/ets/pages/ListPage.ets @@ -18,20 +18,20 @@ import { ImageKnifeComponent, ImageKnifeOption } from '@ohos/imageknife'; @Component struct ListPage { - private datas: string[] = [] + private data: string[] = [] @State ImageKnifeOption: ImageKnifeOption = { loadSrc: $r('app.media.startIcon')} aboutToAppear(): void { for (let i = 0; i < 1000; i++) { - this.datas.push(i.toString()) + this.data.push(i.toString()) } } build() { Row() { List({ space: 10 }) { - ForEach(this.datas, (item: string) => { + ForEach(this.data, (item: string) => { ImageKnifeComponent({ ImageKnifeOption: this.ImageKnifeOption }).height(200).width(200) }, (item: string) => item) } diff --git a/entry/src/main/ets/pages/TestPrefetchToFileCache.ets b/entry/src/main/ets/pages/TestPrefetchToFileCache.ets new file mode 100644 index 0000000..6161021 --- /dev/null +++ b/entry/src/main/ets/pages/TestPrefetchToFileCache.ets @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { ImageKnifeComponent,ImageKnife,ImageKnifeOption } from '@ohos/imageknife' + +@Entry +@Component +struct TestPrefetchToFileCachePage { + @State imageKnifeOption: ImageKnifeOption = { + loadSrc:$r('app.media.startIcon'), + placeholderSrc:$r('app.media.loading') + } + async preload(url:string) { + let fileCachePath = await ImageKnife.getInstance().prefetchToFileCache(url) + console.log("文件缓存的路径是:"+ fileCachePath) + } + build() { + Column() { + Button("磁盘预加载").onClick(async ()=>{ + await this.preload("https://gd-hbimg.huaban.com/e0a25a7cab0d7c2431978726971d61720732728a315ae-57EskW_fw658") + }) + Button("加载图片").onClick(()=>{ + this.imageKnifeOption.loadSrc = "https://gd-hbimg.huaban.com/e0a25a7cab0d7c2431978726971d61720732728a315ae-57EskW_fw658" + }) + ImageKnifeComponent({ + ImageKnifeOption: this.imageKnifeOption + }).width(300).height(300) + } + .height('100%') .width('100%') + } +} \ No newline at end of file diff --git a/entry/src/main/ets/pages/User.ets b/entry/src/main/ets/pages/User.ets index e58319b..717afcf 100644 --- a/entry/src/main/ets/pages/User.ets +++ b/entry/src/main/ets/pages/User.ets @@ -16,7 +16,7 @@ export struct UserAvatar { imgSizes: number = 1 @State ImageKnifeOption: ImageKnifeOption = new ImageKnifeOption() @StorageProp('WeLink_Mob_fontSize_multiple') @Watch('updateImgSize') WeLink_Mob_fontSize_multiple: number = 0 - scaleable: boolean = true; + scalable: boolean = true; @State calcImgSize: number = 100 aboutToAppear(): void { @@ -25,7 +25,7 @@ export struct UserAvatar { } setImageSize() { - if (!this.scaleable) { + if (!this.scalable) { this.calcImgSize = this.imgSize } else if (this.WeLink_Mob_fontSize_multiple < 0.9) { this.calcImgSize = this.imgSize * 0.9 diff --git a/entry/src/main/resources/base/profile/main_pages.json b/entry/src/main/resources/base/profile/main_pages.json index 5b02dd4..378e003 100644 --- a/entry/src/main/resources/base/profile/main_pages.json +++ b/entry/src/main/resources/base/profile/main_pages.json @@ -7,6 +7,7 @@ "pages/LongImagePage", "pages/TransformPage", "pages/UserPage", - "pages/TestImageFlash" + "pages/TestImageFlash", + "pages/TestPrefetchToFileCache" ] } \ No newline at end of file diff --git a/library/src/main/ets/ImageKnife.ets b/library/src/main/ets/ImageKnife.ets index c529d4b..7b82ceb 100644 --- a/library/src/main/ets/ImageKnife.ets +++ b/library/src/main/ets/ImageKnife.ets @@ -18,6 +18,9 @@ import { MemoryLruCache } from './utils/MemoryLruCache'; import { IMemoryCache } from './utils/IMemoryCache' import { FileCache } from './utils/FileCache'; import { ImageKnifeDispatcher } from './ImageKnifeDispatcher'; +import { ImageKnifeOption } from './ImageKnifeOption'; +import { Tools } from './utils/Tools'; +import { common } from '@kit.AbilityKit'; export class ImageKnife { @@ -84,6 +87,40 @@ export class ImageKnife { saveFileCache(key: string, data: ArrayBuffer): void { this.fileCache?.put(key, data) } + getFileCache(): FileCache{ + return this.fileCache as FileCache + } + // 预加载到文件缓存,并返回缓存路径 + prefetchToFileCache(url:string): Promise { + return new Promise((resolve,reject)=>{ + let imageKnifeOption = new ImageKnifeOption() + imageKnifeOption.loadSrc = url + let keys = Tools.generateKey(url) + let cachePath = ImageKnife.getInstance().getFileCache().getFileToPath(keys) + if(cachePath == null || cachePath == "" || cachePath == undefined) { + let request = new ImageKnifeRequest( + imageKnifeOption, + imageKnifeOption.context !== undefined ? imageKnifeOption.context : getContext(this) as common.UIAbilityContext, + 0, + 0, + 0, + { + showPixelMap(version: number, pixelMap: PixelMap | string) { + let cachePaths = ImageKnife.getInstance().getFileCache().getFileToPath(keys) + if(cachePaths != "") { + resolve(cachePaths) + } else { + reject(undefined) + } + } + } + ) + this.execute(request) + } else { + resolve(cachePath) + } + }) + } /** * 清除所有文件缓存 diff --git a/library/src/main/ets/ImageKnifeDispatcher.ets b/library/src/main/ets/ImageKnifeDispatcher.ets index 2befcab..aafc601 100644 --- a/library/src/main/ets/ImageKnifeDispatcher.ets +++ b/library/src/main/ets/ImageKnifeDispatcher.ets @@ -121,7 +121,9 @@ export class ImageKnifeDispatcher { context: currentRequest.context, src: imageSrc, key: key, - customGetImage: currentRequest.ImageKnifeOption.customGetImage + customGetImage: currentRequest.ImageKnifeOption.customGetImage, + onlyRetrieveFromCache: currentRequest.ImageKnifeOption.onlyRetrieveFromCache, + requestSource } // 启动线程下载和解码主图 let task = new taskpool.Task(requestJob, request) @@ -164,7 +166,9 @@ export class ImageKnifeDispatcher { } // 保存内存缓存 - ImageKnife.getInstance().saveMemoryCache(Tools.generateMemoryKey(imageSrc), ImageKnifeData) + if(currentRequest.ImageKnifeOption.isCacheable == undefined || currentRequest.ImageKnifeOption.isCacheable == true) { + ImageKnife.getInstance().saveMemoryCache(Tools.generateMemoryKey(imageSrc), ImageKnifeData) + } if (requestList !== undefined) { @@ -250,7 +254,7 @@ async function requestJob(request: RequestJobRequest): Promise Promise + customGetImage?: (context: Context, src: string | PixelMap | Resource) => Promise, + onlyRetrieveFromCache?: boolean + requestSource:ImageKnifeRequestSource } diff --git a/library/src/main/ets/ImageKnifeOption.ets b/library/src/main/ets/ImageKnifeOption.ets index ddae520..8b62efa 100644 --- a/library/src/main/ets/ImageKnifeOption.ets +++ b/library/src/main/ets/ImageKnifeOption.ets @@ -25,6 +25,10 @@ export class ImageKnifeOption { errorholderSrc?: PixelMap | Resource; objectFit?: ImageFit + // 是否开启一级内存缓存 + isCacheable?: boolean + // 仅使用缓存加载数据 + onlyRetrieveFromCache?: boolean = false; customGetImage?: (context: Context, src: string | PixelMap | Resource) => Promise diff --git a/library/src/main/ets/utils/FileCache.ets b/library/src/main/ets/utils/FileCache.ets index 195a0ad..a4b0453 100644 --- a/library/src/main/ets/utils/FileCache.ets +++ b/library/src/main/ets/utils/FileCache.ets @@ -258,4 +258,20 @@ export class FileCache { return FileUtils.getInstance() .readFileSync(context.cacheDir + FileUtils.SEPARATOR + FileCache.CACHE_FOLDER + FileUtils.SEPARATOR + key) } + /** + * 获取key缓存数据绝对路径 + * + * @params key 数值 + */ + getFileToPath(key: string): string { + if(!!!key) { + throw new Error("key is null,checking the parameter") + } + let path = this.path + key + if(FileUtils.getInstance().exist(path)) { + return path + } else { + return "" + } + } } \ No newline at end of file From aea4ce80f37596335ade57fa93cc3667a87fe233 Mon Sep 17 00:00:00 2001 From: zgf8268 Date: Sat, 27 Apr 2024 16:23:48 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E8=A1=A5=E5=85=85=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E9=A2=84=E5=8A=A0=E8=BD=BD=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?prefetchToFileCache,=E4=BB=A5=E5=8F=8AImageKnifeOption=E5=B1=9E?= =?UTF-8?q?=E6=80=A7isCacheable=E3=80=81onlyRetrieveFromCache?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zgf8268 --- entry/src/main/ets/pages/TestPrefetchToFileCache.ets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/entry/src/main/ets/pages/TestPrefetchToFileCache.ets b/entry/src/main/ets/pages/TestPrefetchToFileCache.ets index 6161021..999e168 100644 --- a/entry/src/main/ets/pages/TestPrefetchToFileCache.ets +++ b/entry/src/main/ets/pages/TestPrefetchToFileCache.ets @@ -23,7 +23,7 @@ struct TestPrefetchToFileCachePage { } async preload(url:string) { let fileCachePath = await ImageKnife.getInstance().prefetchToFileCache(url) - console.log("文件缓存的路径是:"+ fileCachePath) + console.log("preload-fileCachePath=="+ fileCachePath) } build() { Column() {