HSP中,单例模式出现多份实例问题分析总结_2
因为业务需要,需要将AG客户端中要定义多个HSP(HSPA、HSPB)。其中HSPA里定义了单实例ContextInstance,通过getInstance()获取实例。
问题现象:在entry中获取到ContextInstance单例,并给ContextInstance中的变量temp赋值为100。然后再HSPB中读取这个变量,发现读不到之前在entry中赋的值。
问题分析:
1.HSPA中定义两个ts文件ContextInstance.ts,ContextInstance是单例模式。具体定义如下。
从定义可以看出在ContextInstance.ts 单实例类中,定义了变量_temp,我们通过_temp赋值并打印其值来说明是否存在多份实例。
export class ContextInstance {
private static instance: ContextInstance;
private _objects = new Map<string, common.Context>()
private _temp: number = 0;
public setTemp(value: number) {
hilog.debug(1, "demotest", 'setTemp:'+value);
this._temp = value;
}
public geTemp(): number {
hilog.debug(1, "demotest", 'geTemp, temp:'+this._temp);
return this._temp;
}
public static getInstance(): ContextInstance {
if (!ContextInstance.instance) {
ContextInstance.instance = new ContextInstance();
}
return ContextInstance.instance;
}
}
2.在HSPB中定义CardEventUtils.js 类,如下:
export class CardEventUtils {
private static instance: CardEventUtils | null = null;
private tempInfo: number = 0;
private CardEventUtils() {
};
public static getInstance(): CardEventUtils {
if (!CardEventUtils.instance) {
CardEventUtils.instance = new CardEventUtils();
}
return CardEventUtils.instance;
}
public setNumberValue(value: number) {
hilog.debug(1, "demotest", 'test start, uilib set');
ContextInstance.getInstance().setTemp(value);
}
public getNumberValue () :number {
hilog.debug(1, "demotest", 'test start, uilib get');
return ContextInstance.getInstance().geTemp();
}
}
3.将单例类放到对外暴露的Index.ts中,以便在entry中可以直接调用
export { ContextInstance } from './src/main/ets/utils/ContextInstance';
4.entry中EntryAbility增加以下代码片段,以便承载调用单例模式的代码
ContextInstance.getInstance().setTemp(100);
CardEventUtils.getInstance().setNumberValue(10);
let value1 = ContextInstance.getInstance().geTemp();
let value2 = CardEventUtils.getInstance().getNumberValue();
hilog.debug(1, "demotest", 'test 2233start, enter AbilityStage value1:' + value1);
hilog.debug(1, "demotest", 'test 2233start, enter AbilityStage value2:' + value2);
5.在工程级目录的oh-package.json5中添加对HSP的依赖
6.执行程序,程序输出如下日志。从日志可以看出,
两个value值是不一样的。直接调用”ContextInstance“操作的单例变量和直接调用”CardEventUtils“操作的单例变量
不是同一个。
7.为什么会导致这个问题??
当在工程级配置依赖hsp之后,会导致hspA依赖hsp B时直接将两份代码都打包进入hsp A中,没有在hsp A中排除掉hsp B的代码.
HarmonyOS
赞
收藏 0
回答 1
待解决
相关问题
首选项获取实例,实例是否为单例
580浏览 • 1回复 待解决
ArkTS层实例化与单例介绍
499浏览 • 1回复 待解决
实现单例模式下的数据存储
403浏览 • 1回复 待解决
请问当前页面跳转时是否支持单例模式
275浏览 • 1回复 待解决
多实例模式下,UIAbility实例间如何进行数据交互
504浏览 • 1回复 待解决
创建的单例换了页面后不生效问题
699浏览 • 1回复 待解决
关于文档中说har中不能用单例的疑惑
395浏览 • 1回复 待解决
HAR包内的单例对象与HAR包相互之间依赖关系问题。
328浏览 • 1回复 待解决
在ets层能不能创建整个应用全局唯一的单例?
537浏览 • 1回复 待解决
指令数问题分析,如何抓取指令数进行问题拆解和分析。
240浏览 • 1回复 待解决
1230的2d版本出现本地依赖的har包报错问题
580浏览 • 1回复 待解决
Listcontainer多类型复杂布局包含listcontainer出现卡顿
5037浏览 • 1回复 待解决
HarmonyOS参与者的问题分析
6304浏览 • 4回复 待解决
单框架native侧文件读取权限问题
360浏览 • 1回复 待解决
响应时延/掉帧性能问题分析
192浏览 • 1回复 待解决
用special控制多ablitity实例中,打开多个ability后调这个方法会关闭掉其他的ability-
310浏览 • 1回复 待解决
在有HSP模块依赖的应用中运行单元测试似乎有问题。
293浏览 • 1回复 待解决
如何让2个HSP不相互依赖,使用对方的组件
232浏览 • 1回复 待解决
鸿蒙实例教程---无障碍服务出现错误,这是为什么?
5112浏览 • 1回复 待解决
xargs命令中传多个参数实例?
7793浏览 • 1回复 待解决
Navigation管理多页面堆栈太多问题
502浏览 • 1回复 待解决
证书和多设备协作问题!
5348浏览 • 1回复 待解决
基于JS扩展的类Web开发范式框架 什么时候需要多实例管理?
3212浏览 • 1回复 待解决
在添加依赖关系时,各个模块独立声明自己的依赖关系。在工程级oh-package.json5中不要添加对HSP的依赖,否则就会出现单实例异常问题。
在每个模块中生命依赖关系样例: