diff --git a/entry/src/main/ets/pages/testManyNetImageLoadWithPage2.ets b/entry/src/main/ets/pages/testManyNetImageLoadWithPage2.ets index f1acd01..c80e871 100644 --- a/entry/src/main/ets/pages/testManyNetImageLoadWithPage2.ets +++ b/entry/src/main/ets/pages/testManyNetImageLoadWithPage2.ets @@ -22,33 +22,49 @@ import { TestDataSource } from './model/TestDataSource'; struct TestManyNetImageLoadWithPage2 { private data: TestDataSource = new TestDataSource(); private setting: DiskStrategy = new NONE(); + private scroller: Scroller = new Scroller() build() { Scroll() { Column() { - Grid() { + Grid(this.scroller) { LazyForEach(this.data, (item: Material, index) => { - GridItem() { - ImageKnifeComponent({ - imageKnifeOption: { - loadSrc: item.thumbnail, - placeholderSrc: $r('app.media.icon_loading'), - mainScaleType: ScaleType.CENTER_CROP, - placeholderScaleType: ScaleType.CENTER_CROP, - isCacheable: false, - // strategy: this.setting + if(index < 100) { + GridItem() { + Stack({ alignContent: Alignment.BottomEnd }) { + ImageKnifeComponent({ + imageKnifeOption: { + loadSrc: item.thumbnail, + placeholderSrc: $r('app.media.icon_loading'), + mainScaleType: ScaleType.CENTER_CROP, + placeholderScaleType: ScaleType.CENTER_CROP, + isCacheable: false, + // strategy: this.setting + } + }).width('100%').height('100%') + //Grid组件并发加载大量图片会出现白块,对比使用image库也会出现 + //Image(item.thumbnail).width('100%').backgroundColor(Color.Blue).objectFit(ImageFit.Contain) + Text(index+"."+item.name) + .fontSize(10) + .maxLines(1) + .fontColor(Color.White) + .textAlign(TextAlign.Center) + .layoutWeight(1) + .width('100%') + .backgroundColor(Color.Orange) } - }).width('100%').height('100%') - }.width('45%').height(200) - }, (item: string) => JSON.stringify(item)) + }.width('45%').height(200) + } + }, (item: Material) => item.material_id) } .columnsTemplate('1fr 1fr') .columnsGap(8) + .maxCount(8) .rowsGap(10) .width('100%') .hitTestBehavior(HitTestMode.None) .maxCount(10) - .cachedCount(5) + .cachedCount(3) }.margin({ top: 5 }) } } diff --git a/entry/src/ohosTest/ets/test/diskLruCache.test.ets b/entry/src/ohosTest/ets/test/diskLruCache.test.ets index 80840c2..7cc2746 100644 --- a/entry/src/ohosTest/ets/test/diskLruCache.test.ets +++ b/entry/src/ohosTest/ets/test/diskLruCache.test.ets @@ -12,12 +12,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import hilog from '@ohos.hilog'; -import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect, Hypium } from '@ohos/hypium' -import { DiskLruCache, ImageKnifeGlobal, ImageKnife, DiskCacheEntry } from '@ohos/imageknife' -import AbilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry'; -import { AbilityConstant, common, UIAbility, Want } from '@kit.AbilityKit'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium' +import { DiskLruCache, DiskCacheEntry } from '@ohos/imageknife' +import { common } from '@kit.AbilityKit'; import fs from '@ohos.file.fs'; +import { GlobalContext } from '../testability/GlobalContext' const BASE_COUNT: number = 2000; @@ -26,6 +25,7 @@ export default function DiskLruCacheTest() { describe('DiskLruCacheTest', () => { // Defines a test suite. Two parameters are supported: test suite name and test suite function. beforeAll(() => { + //ImageKnife.with(this.context.createModuleContext("entry_test")); // Presets an action, which is performed only once before all test cases of the test suite start. // This API supports only one parameter: preset action function. }) @@ -45,115 +45,100 @@ export default function DiskLruCacheTest() { // This API supports only one parameter: clear action function. }) it('testSetCahe', 0, () => { - let context: Object | undefined = ImageKnifeGlobal.getInstance().getHapContext(); - if (context != undefined) { - let disLruCache: DiskLruCache = DiskLruCache.create(context as common.UIAbilityContext, 1024); - let startTime = new Date().getTime(); - disLruCache.set('test', "Hello World Simple Example."); - disLruCache.set('testABC', "Hello World ABC"); - disLruCache.set('testDE', "Hello World Simple DE"); - expect(String.fromCharCode(...new Uint8Array(disLruCache.get('test') as ArrayBufferLike)) == "Hello World Simple Example.") - .assertTrue() - expect(String.fromCharCode(...new Uint8Array(disLruCache.get('testABC') as ArrayBufferLike)) == "Hello World ABC") - .assertTrue() - expect(String.fromCharCode(...new Uint8Array(disLruCache.get('testDE') as ArrayBufferLike)) == "Hello World Simple DE") - .assertTrue() - let str: string = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; - for (let index = 0; index < 100; index++) { - str += index; - disLruCache.set('test' + index, str); - } - expect(disLruCache.getSize() <= 1024).assertTrue() - endTime(startTime, 'testSetCahe'); - disLruCache.cleanCacheData(); + let context: object | undefined = GlobalContext.getInstance().getObject("hapContext"); + let disLruCache: DiskLruCache = DiskLruCache.create(context as common.UIAbilityContext, 1024); + let startTime = new Date().getTime(); + disLruCache.set('test', "Hello World Simple Example."); + disLruCache.set('testABC', "Hello World ABC"); + disLruCache.set('testDE', "Hello World Simple DE"); + expect(String.fromCharCode(...new Uint8Array(disLruCache.get('test') as ArrayBufferLike)) == "Hello World Simple Example.") + .assertTrue() + expect(String.fromCharCode(...new Uint8Array(disLruCache.get('testABC') as ArrayBufferLike)) == "Hello World ABC") + .assertTrue() + expect(String.fromCharCode(...new Uint8Array(disLruCache.get('testDE') as ArrayBufferLike)) == "Hello World Simple DE") + .assertTrue() + let str: string = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; + for (let index = 0; index < 100; index++) { + str += index; + disLruCache.set('test' + index, str); } + expect(disLruCache.getSize() <= 1024).assertTrue() + endTime(startTime, 'testSetCahe'); + disLruCache.cleanCacheData(); }) it('testGetCacheAsync', 1, () => { - - let context: common.UIAbilityContext = ImageKnifeGlobal.getInstance().getHapContext() as common.UIAbilityContext; - if (context != undefined) { - let data = context.filesDir - let cache: DiskLruCache = DiskLruCache.create(context); - let startTime = new Date().getTime(); - let path = data + '/testFile.txt'; - let file = fs.openSync(path, 0o102); - fs.writeSync(file.fd, "hello, world!"); - let length = fs.statSync(path).size; - let dataArr = new ArrayBuffer(length); - fs.readSync(file.fd, dataArr); - cache.set('testFile', dataArr); - expect(cache.get('testFile')?.byteLength == 13).assertTrue() - endTime(startTime, 'testGetCacheAsync'); - cache.cleanCacheData(); - } + let context: object | undefined = GlobalContext.getInstance().getObject("hapContext"); + let filesDir: object | undefined = GlobalContext.getInstance().getObject("filesDir"); + let cache: DiskLruCache = DiskLruCache.create(context as common.UIAbilityContext, 1024); + let startTime = new Date().getTime(); + let path = filesDir + '/testFile.txt'; + let file = fs.openSync(path, 0o102); + fs.writeSync(file.fd, "hello, world!"); + let length = fs.statSync(path).size; + let dataArr = new ArrayBuffer(length); + fs.readSync(file.fd, dataArr); + cache.set('testFile', dataArr); + expect(cache.get('testFile')?.byteLength == 13).assertTrue() + endTime(startTime, 'testGetCacheAsync'); + cache.cleanCacheData(); }) it('testDeleteCacheDataByKey', 2, () => { - let context: common.UIAbilityContext = ImageKnifeGlobal.getInstance().getHapContext() as common.UIAbilityContext; - if (context != undefined) { - let cache: DiskLruCache = DiskLruCache.create(context); - let startTime = new Date().getTime(); - cache.set('test', "Hello World Simple Example."); - cache.set('testABC', "Hello World ABC"); - expect(String.fromCharCode(...new Uint8Array(cache.get('test') as ArrayBufferLike))) - .assertEqual("Hello World Simple Example."); - expect(String.fromCharCode(...new Uint8Array(cache.get('testABC') as ArrayBufferLike))) - .assertEqual("Hello World ABC"); - cache.deleteCacheDataByKey('test'); - cache.deleteCacheDataByKey('testABC'); - expect(String.fromCharCode(...new Uint8Array(cache.get('test') as ArrayBufferLike))).assertEqual(''); - expect(String.fromCharCode(...new Uint8Array(cache.get('testABC') as ArrayBufferLike))).assertEqual(''); - endTime(startTime, 'testDeleteCacheDataByKey'); - cache.cleanCacheData(); - } + let context: object | undefined = GlobalContext.getInstance().getObject("hapContext"); + let cache: DiskLruCache = DiskLruCache.create(context as common.UIAbilityContext, 1024); + let startTime = new Date().getTime(); + cache.set('test', "Hello World Simple Example."); + cache.set('testABC', "Hello World ABC"); + expect(String.fromCharCode(...new Uint8Array(cache.get('test') as ArrayBufferLike))) + .assertEqual("Hello World Simple Example."); + expect(String.fromCharCode(...new Uint8Array(cache.get('testABC') as ArrayBufferLike))) + .assertEqual("Hello World ABC"); + cache.deleteCacheDataByKey('test'); + cache.deleteCacheDataByKey('testABC'); + expect(String.fromCharCode(...new Uint8Array(cache.get('test') as ArrayBufferLike))).assertEqual(''); + expect(String.fromCharCode(...new Uint8Array(cache.get('testABC') as ArrayBufferLike))).assertEqual(''); + endTime(startTime, 'testDeleteCacheDataByKey'); + cache.cleanCacheData(); }) - it('testGetPath', 3, async () => { - let context: common.UIAbilityContext = ImageKnifeGlobal.getInstance().getHapContext() as common.UIAbilityContext; - if (context != undefined) { - let cache: DiskLruCache = DiskLruCache.create(context); - let startTime = new Date().getTime(); - cache.set('test', "Hello World Simple Example."); - let path: string = '' - await cache.getFileToPathAsync('test').then((data) => { - path = data - }) - expect(String.fromCharCode(...new Uint8Array(cache.get('test') as ArrayBufferLike)) == "Hello World Simple Example.") - .assertTrue() - expect(cache.getFileToPath('test') == path).assertTrue() - expect(cache.getPath() + cache.getCacheMap().getFirstKey() == path).assertTrue() - endTime(startTime, 'testGetPath'); - cache.cleanCacheData(); - } + it('testGetPath', 3, () => { + let context: object | undefined = GlobalContext.getInstance().getObject("hapContext"); + let cache: DiskLruCache = DiskLruCache.create(context as common.UIAbilityContext, 1024); + let startTime = new Date().getTime(); + cache.set('test', "Hello World Simple Example."); + let path: string = cache.getFileToPath('test'); + expect(String.fromCharCode(...new Uint8Array(cache.get('test') as ArrayBufferLike)) == "Hello World Simple Example.") + .assertTrue() + expect(cache.getFileToPath('test') == path).assertTrue() + expect(cache.getPath() + cache.getCacheMap().getFirstKey() == path).assertTrue() + endTime(startTime, 'testGetPath'); + cache.cleanCacheData(); + }) + it('testGetCacheMap', 6, () => { + let context: object | undefined = GlobalContext.getInstance().getObject("hapContext"); + let cache: DiskLruCache = DiskLruCache.create(context as common.UIAbilityContext, 1024); + let startTime = new Date().getTime(); + cache.set('test', "Hello World Simple Example."); + expect(cache.getCacheMap().getFirstKey() == '098f6bcd4621d373cade4e832627b4f6').assertTrue() + expect(cache.getCacheMap().hasKey('098f6bcd4621d373cade4e832627b4f6') == true).assertTrue() + endTime(startTime, 'testGetCacheMap'); + cache.cleanCacheData(); }) - it('testGetCacheMap', 6, async () => { - let context: common.UIAbilityContext = ImageKnifeGlobal.getInstance().getHapContext() as common.UIAbilityContext; - if (context != undefined) { - let cache: DiskLruCache = DiskLruCache.create(context); - let startTime = new Date().getTime(); - cache.set('test', "Hello World Simple Example."); - expect(cache.getCacheMap().getFirstKey() == '098f6bcd4621d373cade4e832627b4f6').assertTrue() - expect(cache.getCacheMap().hasKey('098f6bcd4621d373cade4e832627b4f6') == true).assertTrue() - endTime(startTime, 'testGetCacheMap'); - cache.cleanCacheData(); - } + + it('testGetSize', 7, () => { + let context: object | undefined = GlobalContext.getInstance().getObject("hapContext"); + let cache: DiskLruCache = DiskLruCache.create(context as common.UIAbilityContext, 1024); + let startTime = new Date().getTime(); + cache.set('test', "Hello World Simple Example."); + expect(String.fromCharCode(...new Uint8Array(cache.get('test') as ArrayBufferLike)) == "Hello World Simple Example.") + .assertTrue() + expect(cache.getSize() == 27).assertTrue() + endTime(startTime, 'testGetSize'); + cache.cleanCacheData(); + }) - it('testGetSize', 7, async () => { - let context: common.UIAbilityContext = ImageKnifeGlobal.getInstance().getHapContext() as common.UIAbilityContext; - if (context != undefined) { - let cache: DiskLruCache = DiskLruCache.create(context); - let startTime = new Date().getTime(); - cache.set('test', "Hello World Simple Example."); - expect(String.fromCharCode(...new Uint8Array(cache.get('test') as ArrayBufferLike)) == "Hello World Simple Example.") - .assertTrue() - expect(cache.getSize() == 27).assertTrue() - endTime(startTime, 'testGetSize'); - cache.cleanCacheData(); - } - }) - - it('testDiskCacheEntry', 8, async () => { + it('testDiskCacheEntry', 8, () => { let startTime = new Date().getTime(); let dentry = new DiskCacheEntry('test', 30 * 1024 * 1024) expect(dentry.getKey() == 'test').assertTrue() diff --git a/entry/src/ohosTest/ets/testability/GlobalContext.ets b/entry/src/ohosTest/ets/testability/GlobalContext.ets new file mode 100644 index 0000000..9b38a8a --- /dev/null +++ b/entry/src/ohosTest/ets/testability/GlobalContext.ets @@ -0,0 +1,37 @@ +/* + * The MIT License (MIT) + * Copyright (C) 2023 Huawei Device Co., Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + */ + +export class GlobalContext { + private constructor() { + } + + private static instance: GlobalContext; + private _objects = new Map(); + + public static getInstance(): GlobalContext { + if (!GlobalContext.instance) { + GlobalContext.instance = new GlobalContext(); + } + return GlobalContext.instance; + } + + getObject(value: string): Object | undefined { + return this._objects.get(value); + } + + setObject(key: string, objectClass: Object): void { + this._objects.set(key, objectClass); + } +} \ No newline at end of file diff --git a/entry/src/ohosTest/ets/testability/TestAbility.ets b/entry/src/ohosTest/ets/testability/TestAbility.ets index 140dbda..1860105 100644 --- a/entry/src/ohosTest/ets/testability/TestAbility.ets +++ b/entry/src/ohosTest/ets/testability/TestAbility.ets @@ -22,6 +22,7 @@ import {ImageKnife,ImageKnifeDrawFactory,ImageKnifeGlobal} from '@ohos/libraryim import AbilityConstant from '@ohos.app.ability.AbilityConstant'; import Want from '@ohos.app.ability.Want'; import { BusinessError } from '@ohos.base' +import {GlobalContext } from './GlobalContext' export default class TestAbility extends UIAbility { onCreate(want: Want, param: AbilityConstant.LaunchParam) { @@ -33,6 +34,8 @@ export default class TestAbility extends UIAbility { Hypium.hypiumTest(abilityDelegator, abilityDelegatorArguments, testsuite) // 鍒濆鍖杧ts鐨処mageKnife ImageKnife.with(this.context.createModuleContext("entry_test")); + GlobalContext.getInstance().setObject("hapContext",this.context.createModuleContext("entry_test")); + GlobalContext.getInstance().setObject("filesDir",this.context.createModuleContext("entry_test").filesDir); } onDestroy() { diff --git a/library/src/main/ets/components/imageknife/ImageKnife.ets b/library/src/main/ets/components/imageknife/ImageKnife.ets index 8efb31a..a06c5cf 100644 --- a/library/src/main/ets/components/imageknife/ImageKnife.ets +++ b/library/src/main/ets/components/imageknife/ImageKnife.ets @@ -310,47 +310,24 @@ export class ImageKnife { request.addHeaderMap(this.headerMap) } + this.generateDataCacheKey(request) // 棣栧厛鎵ц鍗犱綅鍥 瑙f瀽浠诲姟 if (request.placeholderSrc) { - let loadKey = ''; - if (typeof request.placeholderSrc == 'string') { - loadKey = request.placeholderSrc; - } else { - loadKey = JSON.stringify(request.placeholderSrc); - } - let size = JSON.stringify(request.size); - request.placeholderCacheKey = this.generateCacheKey(loadKey, size, request.dontAnimateFlag, request.signature) this.taskpoolLoadResource(request, ResourceUsage.PLACEHOLDER); } // 鍏舵鎵ц閲嶈瘯鍗犱綅鍥 瑙f瀽浠诲姟 if (request.retryholderSrc) { - let loadKey = ''; - if (typeof request.retryholderSrc == 'string') { - loadKey = request.retryholderSrc; - } else { - loadKey = JSON.stringify(request.retryholderSrc); - } - let size = JSON.stringify(request.size); - request.retryholderCacheKey = this.generateCacheKey(loadKey, size, request.dontAnimateFlag, request.signature) this.taskpoolLoadResource(request, ResourceUsage.RETRYHODLER); } // 鏈鍚庤В鏋愰敊璇崰浣嶅浘 if (request.errorholderSrc) { - let loadKey = ''; - if (typeof request.errorholderSrc == 'string') { - loadKey = request.errorholderSrc; - } else { - loadKey = JSON.stringify(request.errorholderSrc); - } - let size = JSON.stringify(request.size); - request.errorholderCacheKey = this.generateCacheKey(loadKey, size, request.dontAnimateFlag, request.signature) this.taskpoolLoadResource(request, ResourceUsage.ERRORHOLDER); } return this.parseSource(request); } - loadResources(request: RequestOption) { + generateDataCacheKey(request: RequestOption){ let factories: EngineKeyInterface; let cacheKey: string; let transferKey: string; @@ -394,12 +371,36 @@ export class ImageKnife { // 鐢熸垚纾佺洏缂撳瓨婧愭暟鎹甼ey 鍘熷鏁版嵁淇濆瓨鍦ㄧ鐩 dataKey = factories.generateOriginalDiskCacheKey(loadKey, signature); - + if (request.placeholderSrc) { + let placeholderLoadKey = ''; + if (typeof request.placeholderSrc == 'string') { + placeholderLoadKey = request.placeholderSrc; + } else { + placeholderLoadKey = JSON.stringify(request.placeholderSrc); + } + request.placeholderCacheKey = this.generateCacheKey(placeholderLoadKey, size, dontAnimateFlag, signature) + } + if (request.retryholderSrc) { + let retryholderLoadKey = ''; + if (typeof request.retryholderSrc == 'string') { + retryholderLoadKey = request.retryholderSrc; + } else { + retryholderLoadKey = JSON.stringify(request.retryholderSrc); + } + request.retryholderCacheKey = this.generateCacheKey(retryholderLoadKey, size, dontAnimateFlag, signature) + } + if (request.errorholderSrc) { + let errorholderLoadKey = ''; + if (typeof request.errorholderSrc == 'string') { + errorholderLoadKey = request.errorholderSrc; + } else { + errorholderLoadKey = JSON.stringify(request.errorholderSrc); + } + request.errorholderCacheKey = this.generateCacheKey(errorholderLoadKey, size, dontAnimateFlag, signature) + } request.generateCacheKey = cacheKey; request.generateResourceKey = transferKey; request.generateDataKey = dataKey; - - this.loadCacheManager(request); } private generateCacheKey(loadkey: string, size: string, dontAnimateFlag: boolean, signature?: ObjectKey) { @@ -528,40 +529,30 @@ export class ImageKnife { //澶氱嚎绋嬭姹傚姞杞借祫婧 private taskpoolLoadResource(request: RequestOption, usageType: ResourceUsage) { + let mainCache = this.memoryCacheProxy.loadMemoryCache(request.generateCacheKey, request.isCacheable); + let placeholderCache = this.memoryCacheProxy.loadMemoryCache(request.placeholderCacheKey, true); + let retryholderCache = this.memoryCacheProxy.loadMemoryCache(request.retryholderCacheKey, true); + let errorholderCacheKey = this.memoryCacheProxy.loadMemoryCache(request.errorholderCacheKey, true); - if (usageType == "placeholder") { - // 鍏堜粠鍐呭瓨涓彇鍊 - let cache = this.memoryCacheProxy.loadMemoryCache(request.placeholderCacheKey, true); - if (cache) { - LogUtil.info("imageknife load placeholder from MemoryCache") - request.placeholderOnComplete(cache); - return; - } - } else if (usageType == "retryholder") { - // 鍏堜粠鍐呭瓨涓彇鍊 - let cache = this.memoryCacheProxy.loadMemoryCache(request.retryholderCacheKey, true); - if (cache) { - LogUtil.info("imageknife load retryholder from MemoryCache") - request.retryholderOnComplete(cache); - return; - } - } else if (usageType == "errorholder") { - let cache = this.memoryCacheProxy.loadMemoryCache(request.errorholderCacheKey, true); - if (cache) { - LogUtil.info("imageknife load errorholder from MemoryCache") - request.errorholderOnComplete(cache); - return; - } - } else { - // 鍏堜粠鍐呭瓨涓彇鍊 - let cache = this.memoryCacheProxy.loadMemoryCache(request.generateCacheKey, request.isCacheable); - if (cache) { - LogUtil.info("imageknife load resource from MemoryCache") - cache.waitSaveDisk = false; - request.loadComplete(cache); - return; - } + if (usageType == "placeholder" && placeholderCache && !mainCache && !retryholderCache && !errorholderCacheKey) { + LogUtil.info("imageknife load placeholder from MemoryCache") + request.placeholderOnComplete(placeholderCache); + return; + } else if (usageType == "retryholder" && retryholderCache && !mainCache && !errorholderCacheKey) { + LogUtil.info("imageknife load retryholder from MemoryCache") + request.retryholderOnComplete(retryholderCache); + return; + } else if (usageType == "errorholder" && errorholderCacheKey && !mainCache) { + LogUtil.info("imageknife load errorholder from MemoryCache") + request.errorholderOnComplete(errorholderCacheKey); + return; + } else if (usageType == "main" && mainCache) { + LogUtil.info("imageknife load mainsource from MemoryCache") + mainCache.waitSaveDisk = false; + request.loadComplete(mainCache); + return; } + //鍥剧墖鍙樻崲鏂规硶鏃犳硶鐩存帴浼犻掑埌瀛愮嚎绋嬶紝杩欓噷鍏堟妸瀵硅薄鍚嶅拰鏋勯犲弬鏁颁紶閫掑埌瀛愮嚎绋嬶紝鐒跺悗鍦ㄥ瓙绾跨▼涓疄渚嬪寲鍙樻崲鏂规硶 let transformations: string [][] = []; if (usageType == ResourceUsage.MAIN) { @@ -670,14 +661,14 @@ export class ImageKnife { request.loadComplete(imageKnifeData); } else if (typeof request.loadSrc == 'string') { // 杩涘叆涓夌骇缂撳瓨妯″瀷 - return this.loadResources(request); + return this.loadCacheManager(request); } else { let res = request.loadSrc as Resource; if (typeof res.id != 'undefined' && typeof res.type != 'undefined') { // 杩涘叆涓夌骇缂撳瓨妯″瀷 鏈湴璧勬簮涓嶅弬涓庣鐩樼紦瀛 let none = new NONE(); request.diskCacheStrategy(none); - this.loadResources(request); + this.loadCacheManager(request); } else { LogUtil.error("杈撳叆鍙傛暟鏈夐棶棰橈紒") } @@ -696,63 +687,63 @@ export class ImageKnife { async function taskExecute(taskParams: string, headers: Map, moduleContext: common.UIAbilityContext): Promise { // try { - let params: object = JSON.parse(taskParams); - let option = params["request"] as RequestOption; - let transformations = params["transformations"] as string [][]; - let usageType = params["usageType"] as string; + let params: object = JSON.parse(taskParams); + let option = params["request"] as RequestOption; + let transformations = params["transformations"] as string [][]; + let usageType = params["usageType"] as string; - //瀛愮嚎绋嬫瀯閫燫equestOption瀵硅薄 - let newRequestOption = new RequestOption(); - newRequestOption.uuid = option.uuid; - newRequestOption.loadSrc = option.loadSrc; - newRequestOption.dontAnimateFlag = option.dontAnimateFlag; - newRequestOption.generateCacheKey = option.generateCacheKey; - newRequestOption.generateResourceKey = option.generateResourceKey; - newRequestOption.generateDataKey = option.generateDataKey; - newRequestOption.thumbSizeMultiplier = option.thumbSizeMultiplier; - newRequestOption.thumbDelayTime = option.thumbDelayTime; - newRequestOption.size = option.size; + //瀛愮嚎绋嬫瀯閫燫equestOption瀵硅薄 + let newRequestOption = new RequestOption(); + newRequestOption.uuid = option.uuid; + newRequestOption.loadSrc = option.loadSrc; + newRequestOption.dontAnimateFlag = option.dontAnimateFlag; + newRequestOption.generateCacheKey = option.generateCacheKey; + newRequestOption.generateResourceKey = option.generateResourceKey; + newRequestOption.generateDataKey = option.generateDataKey; + newRequestOption.thumbSizeMultiplier = option.thumbSizeMultiplier; + newRequestOption.thumbDelayTime = option.thumbDelayTime; + newRequestOption.size = option.size; - newRequestOption.placeholderSrc = option.placeholderSrc; - newRequestOption.errorholderSrc = option.errorholderSrc; - newRequestOption.retryholderSrc = option.retryholderSrc; - newRequestOption.onlyRetrieveFromCache = option.onlyRetrieveFromCache; - newRequestOption.gpuEnabled = option.gpuEnabled; - newRequestOption.headers = headers; - newRequestOption.signature = option.signature; - ImageKnifeGlobal.getInstance().setHapContext(moduleContext); - newRequestOption.moduleContext = moduleContext; - if (option.isCacheable != null && option.isCacheable != undefined) { - newRequestOption.isCacheable = option.isCacheable; - } - //濡傛灉鏄湰鍦板浘鐗囦笉浣滅鐩樼紦瀛 - if (typeof option.loadSrc !== 'string') { - let none = new NONE(); - newRequestOption.diskCacheStrategy(none); - } + newRequestOption.placeholderSrc = option.placeholderSrc; + newRequestOption.errorholderSrc = option.errorholderSrc; + newRequestOption.retryholderSrc = option.retryholderSrc; + newRequestOption.onlyRetrieveFromCache = option.onlyRetrieveFromCache; + newRequestOption.gpuEnabled = option.gpuEnabled; + newRequestOption.headers = headers; + newRequestOption.signature = option.signature; + ImageKnifeGlobal.getInstance().setHapContext(moduleContext); + newRequestOption.moduleContext = moduleContext; + if (option.isCacheable != null && option.isCacheable != undefined) { + newRequestOption.isCacheable = option.isCacheable; + } + //濡傛灉鏄湰鍦板浘鐗囦笉浣滅鐩樼紦瀛 + if (typeof option.loadSrc !== 'string') { + let none = new NONE(); + newRequestOption.diskCacheStrategy(none); + } - if (usageType == "placeholder") { - let manager = new PlaceHolderManager(newRequestOption); - return await new Promise(manager.process); - } else if (usageType == "retryholder") { - let manager = new RetryHolderManager(newRequestOption); - return await new Promise(manager.process); - } else if (usageType == "errorholder") { - let manager = new ErrorHolderManager(newRequestOption); - return await new Promise(manager.process); - } else { - if (transformations) { - for (let i = 0; i < transformations.length; i++) { - let className = transformations[i][0] as string; - let params = transformations[i][1] as string; - newRequestOption.addTransformations(className, params); - } + if (usageType == "placeholder") { + let manager = new PlaceHolderManager(newRequestOption); + return await new Promise(manager.process); + } else if (usageType == "retryholder") { + let manager = new RetryHolderManager(newRequestOption); + return await new Promise(manager.process); + } else if (usageType == "errorholder") { + let manager = new ErrorHolderManager(newRequestOption); + return await new Promise(manager.process); + } else { + if (transformations) { + for (let i = 0; i < transformations.length; i++) { + let className = transformations[i][0] as string; + let params = transformations[i][1] as string; + newRequestOption.addTransformations(className, params); } - let newDataFetch = new DownloadClient(); - let newResourceFetch = new ParseResClient(); - let manager = new RequestManager(newRequestOption, newDataFetch, newResourceFetch); - return await new Promise(manager.process); } + let newDataFetch = new DownloadClient(); + let newResourceFetch = new ParseResClient(); + let manager = new RequestManager(newRequestOption, newDataFetch, newResourceFetch); + return await new Promise(manager.process); + } // } catch (e) { // console.log(e) // return await new Promise(() => { diff --git a/library/src/main/ets/components/imageknife/ImageKnifeComponent.ets b/library/src/main/ets/components/imageknife/ImageKnifeComponent.ets index f6e1171..6362994 100644 --- a/library/src/main/ets/components/imageknife/ImageKnifeComponent.ets +++ b/library/src/main/ets/components/imageknife/ImageKnifeComponent.ets @@ -811,7 +811,7 @@ export struct ImageKnifeComponent { ScaleTypeHelper.drawImageWithScaleType(context, scaleType, pixelmap, px2vp(frameW), px2vp(frameH), compWidth, compHeight, px2vp(frame.dims.left), px2vp(frame.dims.top)) // tips:worker濡傛灉涓嶆槸鍦ㄥ睍绀洪〉闈腑鍒涘缓,浣跨敤瀛愮嚎绋嬪洖鏉ョ殑鏁版嵁鍒涘缓鐨勫浘鐗,浼氬鑷碿anvas缁樺埗涓嶅嚭鏉 context.restore(); - LogUtil.log('ImageKnifeComponent default drawMainSource end!') + LogUtil.log('ImageKnifeComponent canvasDrawPixelMap end!') } } diff --git a/library/src/main/ets/components/imageknife/RequestOption.ets b/library/src/main/ets/components/imageknife/RequestOption.ets index 837bbf0..f2c38aa 100644 --- a/library/src/main/ets/components/imageknife/RequestOption.ets +++ b/library/src/main/ets/components/imageknife/RequestOption.ets @@ -92,7 +92,6 @@ export class RequestOption { errorholderSrc: PixelMap | Resource | undefined = undefined; errorholderFunc: AsyncSuccess | undefined = undefined; errorholderData: ImageKnifeData | undefined = undefined; - ; thumbSizeMultiplier: number = 0; // 濡傛灉瀛樺湪缂╃暐鍥撅紝鍒欎富鍥惧欢鏃1s鍔犺浇 thumbDelayTime: number = 1000 @@ -528,7 +527,7 @@ export class RequestOption { retryholderOnError = (error: BusinessError | string) => { LogUtil.log("閲嶈瘯鍗犱綅鍥捐В鏋愬け璐 error =" + error) } - loadComplete = async (imageKnifeData: ImageKnifeData) => { + loadComplete = (imageKnifeData: ImageKnifeData) => { this.setMemoryCache(imageKnifeData,this.generateCacheKey); if (typeof this.loadSrc == 'string') { this.setDiskCache(); diff --git a/library/src/main/ets/components/imageknife/utils/ParseImageUtil.ets b/library/src/main/ets/components/imageknife/utils/ParseImageUtil.ets index 9b94445..fd3cb98 100644 --- a/library/src/main/ets/components/imageknife/utils/ParseImageUtil.ets +++ b/library/src/main/ets/components/imageknife/utils/ParseImageUtil.ets @@ -24,7 +24,6 @@ export class ParseImageUtil implements IParseImage { this.parseImageThumbnail(1, imageinfo, onCompleteFunction, onErrorFunction) } - // scale(0,1) parseImageThumbnail(scale: number, imageinfo: ArrayBuffer, onCompleteFunction: (value: PixelMap) => void | PromiseLike, onErrorFunction: (reason?: BusinessError | string) => void) { let imageSource: image.ImageSource = image.createImageSource(imageinfo); // 姝ラ涓锛氭枃浠惰浆涓簆ixelMap 鐒跺悗鍙樻崲 缁橧mage缁勪欢 @@ -52,41 +51,5 @@ export class ParseImageUtil implements IParseImage { onErrorFunction(err); imageSource.release() }) - - // taskPoolExecutePixelMap(imageinfo,scale,onCompleteFunction,onErrorFunction); //澶氱嚎绋嬫帴鍙 } -} - - -@Concurrent -async function taskParseImage(arrayBuffer: ArrayBuffer, scale: number): Promise { - let imageSource: image.ImageSource = image.createImageSource(arrayBuffer); // 姝ラ涓锛氭枃浠惰浆涓簆ixelMap 鐒跺悗鍙樻崲 缁橧mage缁勪欢 - let value = await imageSource.getImageInfo(); - let hValue = Math.round(value.size.height * scale); - let wValue = Math.round(value.size.width * scale); - let defaultSize: image.Size = { - height: hValue, - width: wValue - }; - let opts: image.DecodingOptions = { - editable: true, - desiredSize: defaultSize - }; - let pixelMap = await imageSource.createPixelMap(opts) - LogUtil.log("ceshi321 : Succeeded in creating pixelmap taskpool " + pixelMap.getPixelBytesNumber()) - imageSource.release() - return pixelMap; -} - -function taskPoolExecutePixelMap(arrayBuffer: ArrayBuffer, scale: number, onCompleteFunction: (value: PixelMap) => void | PromiseLike, onErrorFunction: (reason?: BusinessError | string) => void) { - LogUtil.log("ceshi321 : arrayBuffer闀垮害" + arrayBuffer.byteLength); - let task = new taskpool.Task(taskParseImage, arrayBuffer, scale); - task.setTransferList([]); - taskpool.execute(task).then((pixelmap: Object) => { - LogUtil.log('ceshi321 : Succeeded in creating pixelmap Ui .' + (pixelmap as image.PixelMap).getPixelBytesNumber()) - onCompleteFunction(pixelmap as image.PixelMap); - }).catch((err: string) => { - LogUtil.log("ceshi321 : test occur error: " + err); - onErrorFunction(err); - }); } \ No newline at end of file diff --git a/library/src/main/ets/components/imageknife/utils/gif/GIFParseImpl.ets b/library/src/main/ets/components/imageknife/utils/gif/GIFParseImpl.ets index 0d63892..abe1a37 100644 --- a/library/src/main/ets/components/imageknife/utils/gif/GIFParseImpl.ets +++ b/library/src/main/ets/components/imageknife/utils/gif/GIFParseImpl.ets @@ -75,49 +75,5 @@ export class GIFParseImpl implements IParseGif { imageSource.release(); callback(undefined,err) }) - //taskPoolExecutePixelMapList(imageinfo,callback); //澶氱嚎绋嬫帴鍙 - } -} - -@Concurrent -async function taskParseGif(arrayBuffer: ArrayBuffer): Promise { - let imageSource = image.createImageSource(arrayBuffer); - let data: GIFFrame[] = []; - let decodeOpts: image.DecodingOptions = { - sampleSize: 1, - editable: true, - rotate: 0 - } - let pixelList = await imageSource.createPixelMapList(decodeOpts); - if (pixelList.length > 0) { - let pixelmap = pixelList[0]; - let imageInfo = await pixelmap.getImageInfo(); - let delayTimes = await imageSource.getDelayTimeList(); - for (let i = 0; i < pixelList.length; i++) { - let frame = new GIFFrame(); - frame.drawPixelMap = pixelList[i]; - frame.dims = { width: imageInfo.size.width, height: imageInfo.size.height, top: 0, left: 0 } - if (i < delayTimes.length) { - frame.delay = delayTimes[i]; - } else { - frame.delay = delayTimes[delayTimes.length - 1] - } - data.push(frame) - } - } - return data; -} - -function taskPoolExecutePixelMapList(arrayBuffer: ArrayBuffer, callback: (data?: GIFFrame[], err?: BusinessError | string) => void) { - LogUtil.log("ceshi321 : arrayBuffer闀垮害" + arrayBuffer.byteLength) - let task = new taskpool.Task(taskParseGif, arrayBuffer) - task.setTransferList([]) - taskpool.execute(task).then((imageFrames: Object) => { - // LogUtil.log('ceshi321 : Succeeded in creating pixelmap Ui .' + imageFrames.getPixelBytesNumber()) - callback(imageFrames as GIFFrame[],undefined) - }).catch((err: string) => { - LogUtil.log("ceshi321 : test occur error: " + err) - callback(undefined,err); - }); } \ No newline at end of file