1.抽取interface到data类

2.实现缓存未完成初始化时,子线程不写文件

Signed-off-by: madixin <madixin@huawei.com>
This commit is contained in:
madixin 2024-05-04 09:16:57 +08:00
parent 91634663dc
commit b99e97d811
8 changed files with 73 additions and 51 deletions

View File

@ -14,7 +14,7 @@
*/
import { IEngineKey, ImageKnifeOption, PixelMapTransformation } from '@ohos/imageknife';
import { SparkMD5 } from '@ohos/imageknife/src/main/ets/3rd_party/sparkmd5/spark-md5';
import { ImageKnifeRequestSource } from '@ohos/imageknife/src/main/ets/ImageKnifeDispatcher';
import { ImageKnifeRequestSource } from '@ohos/imageknife/src/main/ets/model/ImageKnifeData';
//全局自定义key demo
@Sendable

View File

@ -13,11 +13,11 @@
* limitations under the License.
*/
import { ImageKnifeRequest } from './ImageKnifeRequest';
import { ReadCacheStrategyType, ImageKnifeData } from './model/ImageKnifeData';
import { ReadCacheStrategyType, ImageKnifeData, ImageKnifeRequestSource } from './model/ImageKnifeData';
import { MemoryLruCache } from './utils/MemoryLruCache';
import { IMemoryCache } from './utils/IMemoryCache'
import { FileCache } from './utils/FileCache';
import { ImageKnifeDispatcher, ImageKnifeRequestSource } from './ImageKnifeDispatcher';
import { ImageKnifeDispatcher } from './ImageKnifeDispatcher';
import { IEngineKey } from './key/IEngineKey';
import { HeaderOptions, ImageKnifeOption } from './ImageKnifeOption';
import { DefaultEngineKey } from './key/DefaultEngineKey';
@ -56,6 +56,15 @@ export class ImageKnife {
this.fileCache = new FileCache(context, size, memory)
this.fileCache.initFileCache()
}
/**
* 判断文件缓存是否初始化
* @returns 是否初始化
*/
public isFileCacheInit(): boolean {
return this.fileCache === undefined ? false : this.fileCache.isFileCacheInit()
}
/**
* 全局添加单个请求头
* @param key 请求头属性

View File

@ -19,7 +19,6 @@ import List from '@ohos.util.List';
import LightWeightMap from '@ohos.util.LightWeightMap';
import { LogUtil } from './utils/LogUtil';
import buffer from '@ohos.buffer';
import common from '@ohos.app.ability.common';
import { FileCache } from './utils/FileCache';
import fs from '@ohos.file.fs';
import { ImageKnife } from './ImageKnife';
@ -33,8 +32,7 @@ import { FileTypeUtil } from './utils/FileTypeUtil';
import util from '@ohos.util';
import { IEngineKey } from './key/IEngineKey';
import { DefaultEngineKey } from './key/DefaultEngineKey';
import { HeaderOptions } from './ImageKnifeOption';
import { PixelMapTransformation } from './transform/PixelMapTransformation';
import { ImageKnifeRequestWithSource , ImageKnifeRequestSource , RequestJobResult , RequestJobRequest } from './model/ImageKnifeData'
export class ImageKnifeDispatcher {
// 最大并发
@ -116,7 +114,7 @@ export class ImageKnifeDispatcher {
customGetImage: currentRequest.imageKnifeOption.customGetImage,
onlyRetrieveFromCache: currentRequest.imageKnifeOption.onlyRetrieveFromCache,
transformation:currentRequest.imageKnifeOption.transformation,
writeCacheStrategy: currentRequest.imageKnifeOption.writeCacheStrategy,
writeCacheStrategy: ImageKnife.getInstance().isFileCacheInit() ? currentRequest.imageKnifeOption.writeCacheStrategy : WriteCacheStrategyType.Memory, // 未初始化文件缓存时,不写文件缓存
engineKey: this.engineKey,
signature: currentRequest.imageKnifeOption.signature,
requestSource
@ -246,7 +244,7 @@ async function requestJob(request: RequestJobRequest): Promise<RequestJobResult
LogUtil.log("customGetImage customGetImage");
resBuf = await request.customGetImage(request.context, request.src)
// 保存文件缓存
if (resBuf !== undefined) {
if (resBuf !== undefined && request.writeCacheStrategy !== WriteCacheStrategyType.Memory) {
let copyBuf = buffer.concat([buffer.from(resBuf)]).buffer; // IDE有bug不能直接获取resBuf.byteLength
bufferSize = copyBuf.byteLength
FileCache.saveFileCacheOnlyFile(request.context, fileKey, resBuf)
@ -258,7 +256,7 @@ async function requestJob(request: RequestJobRequest): Promise<RequestJobResult
if (request.src.indexOf("http://") == 0 || request.src.indexOf("https://") == 0) { //从网络下载
// 先从文件缓存获取
resBuf = FileCache.getFileCacheByFile(request.context, fileKey)
if (resBuf === undefined && request.onlyRetrieveFromCache != true && request.requestSource == 0) {
if (resBuf === undefined && request.onlyRetrieveFromCache != true && request.requestSource === ImageKnifeRequestSource.SRC) {
let httpRequest = http.createHttp();
let progress: number = 0
const headerObj: Record<string,object> = {}
@ -323,9 +321,9 @@ async function requestJob(request: RequestJobRequest): Promise<RequestJobResult
}
}
} else if ((request.src as Resource).id !== undefined) { //从资源文件获取
if (resBuf == undefined && request.onlyRetrieveFromCache != true && request.requestSource == 0) {
if (resBuf == undefined && request.onlyRetrieveFromCache != true && request.requestSource == ImageKnifeRequestSource.SRC) {
resBuf = request.context.resourceManager.getMediaContentSync((request.src as Resource).id).buffer as ArrayBuffer
} else if (resBuf == undefined && request.requestSource != 0) {
} else if (resBuf == undefined && request.requestSource != ImageKnifeRequestSource.SRC) {
resBuf = request.context.resourceManager.getMediaContentSync((request.src as Resource).id).buffer as ArrayBuffer
}
}
@ -362,7 +360,7 @@ async function requestJob(request: RequestJobRequest): Promise<RequestJobResult
})
// 图形变化
if (request.requestSource == 0 && request.transformation !== undefined) {
if (request.requestSource === ImageKnifeRequestSource.SRC && request.transformation !== undefined) {
resPixelmap = await request.transformation?.transform(request.context, resPixelmap!, 0, 0)
}
@ -373,35 +371,3 @@ async function requestJob(request: RequestJobRequest): Promise<RequestJobResult
};
}
export enum ImageKnifeRequestSource {
SRC,
PLACE_HOLDER,
ERROR_HOLDER
}
export interface ImageKnifeRequestWithSource {
request: ImageKnifeRequest
source: ImageKnifeRequestSource
}
interface RequestJobResult {
pixelMap: PixelMap | string | undefined
bufferSize: number
fileKey: string
}
interface RequestJobRequest {
context: common.UIAbilityContext,
src: string | PixelMap | Resource,
headers?:Array<HeaderOptions>,
allHeaders:Map<string,Object>,
customGetImage?: (context: Context, src: string | PixelMap | Resource) => Promise<ArrayBuffer | undefined>,
onlyRetrieveFromCache?: boolean
requestSource:ImageKnifeRequestSource
transformation?: PixelMapTransformation
writeCacheStrategy?: WriteCacheStrategyType
signature?: string
engineKey:IEngineKey
}

View File

@ -13,12 +13,8 @@
* limitations under the License.
*/
import { ImageKnifeOption } from './ImageKnifeOption';
import { ImageKnifeData } from './model/ImageKnifeData';
import { ImageKnife } from './ImageKnife'
import common from '@ohos.app.ability.common';
import { SparkMD5 } from './3rd_party/sparkmd5/spark-md5'
import { LogUtil } from './utils/LogUtil'
import { ImageKnifeRequestSource } from './ImageKnifeDispatcher';
export class ImageKnifeRequest {

View File

@ -16,7 +16,7 @@ import { SparkMD5 } from '../3rd_party/sparkmd5/spark-md5';
import { ImageKnifeOption } from '../ImageKnifeOption';
import { IEngineKey } from './IEngineKey';
import { PixelMapTransformation } from '../transform/PixelMapTransformation';
import { ImageKnifeRequestSource } from '../ImageKnifeDispatcher';
import { ImageKnifeRequestSource } from '../model/ImageKnifeData';
@Sendable
export class DefaultEngineKey implements IEngineKey {

View File

@ -12,8 +12,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { ImageKnifeRequestSource } from '../ImageKnifeDispatcher'
import { ImageKnifeOption } from '../ImageKnifeOption'
import { ImageKnifeRequestSource } from '../model/ImageKnifeData'
export interface IEngineKey {
// 生成内存缓存key

View File

@ -12,6 +12,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { HeaderOptions } from '../ImageKnifeOption'
import { ImageKnifeRequest } from '../ImageKnifeRequest'
import { IEngineKey } from '../key/IEngineKey'
import { PixelMapTransformation } from '../transform/PixelMapTransformation'
import common from '@ohos.app.ability.common';
export interface ImageKnifeData {
source: PixelMap | string,
imageWidth: number,
@ -40,3 +46,44 @@ export enum WriteCacheStrategyType {
File = 2
}
/**
* 区分是src,placehodler,还是error_holder
*/
export enum ImageKnifeRequestSource {
SRC,
PLACE_HOLDER,
ERROR_HOLDER
}
export interface ImageKnifeRequestWithSource {
request: ImageKnifeRequest
source: ImageKnifeRequestSource
}
/**
* request子线程处理时的返回
*/
export interface RequestJobResult {
pixelMap: PixelMap | string | undefined
bufferSize: number
fileKey: string
}
/**
* request子线程处理时的请求参数
*/
export interface RequestJobRequest {
context: common.UIAbilityContext,
src: string | PixelMap | Resource,
headers?: Array<HeaderOptions>,
allHeaders: Map<string, Object>,
customGetImage?: (context: Context, src: string | PixelMap | Resource) => Promise<ArrayBuffer | undefined>,
onlyRetrieveFromCache?: boolean
requestSource: ImageKnifeRequestSource
transformation?: PixelMapTransformation
writeCacheStrategy?: WriteCacheStrategyType
signature?: string
engineKey: IEngineKey
}

View File

@ -103,6 +103,10 @@ export class FileCache {
this.isInited = true
}
public isFileCacheInit():boolean {
return this.isInited
}
// 添加缓存键值对,同时写文件
put(key: string, value: ArrayBuffer): void {
if (key == null || value == null) {