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
待解决
相关问题
ArkTS多线程下使用单例会创建多份实例
2114浏览 • 1回复 待解决
HarmonyOS 多HSP依赖同一个HAR包的单例问题
1025浏览 • 1回复 待解决
#鸿蒙通关秘籍#PageAbility的单实例和多实例模式有何异同?
1287浏览 • 1回复 待解决
单例在hsp中存在多个的情况
1150浏览 • 1回复 待解决
首选项获取实例,实例是否为单例
2853浏览 • 1回复 待解决
HarmonyOS 单例模式不生效
1312浏览 • 1回复 待解决
HarmonyOS Entry和Hsp中创建的单例失效
1175浏览 • 1回复 待解决
ArkTS层实例化与单例介绍
5012浏览 • 1回复 待解决
HarmonyOS 单例问题
1450浏览 • 1回复 待解决
鸿蒙next 单例模式如何实现
697浏览 • 1回复 待解决
HarmonyOS navigation有单例模式吗
1346浏览 • 1回复 待解决
HarmonyOS 关于单例问题
1590浏览 • 1回复 待解决
HarmonyOS NEXT开发中两个HSP之间相关调用,单例不生效问题
482浏览 • 0回复 待解决
实现单例模式下的数据存储
2399浏览 • 1回复 待解决
HarmonyOS navigation如何实现单例模式页面
1390浏览 • 1回复 待解决
HarmonyOS 单例模式拿不到类的对象
1588浏览 • 1回复 待解决
HarmonyOS TaskPool子线程单例问题
1387浏览 • 1回复 待解决
HarmonyOS 两个HSP之间相关调用,单例不生效
754浏览 • 1回复 待解决
HarmonyOS Navigation是否有办法类似Router中的RouterMode实现单例模式
1279浏览 • 1回复 待解决
HarmonyOS 单例模式打开已有page,page执行什么方法
774浏览 • 1回复 待解决
请问当前页面跳转时是否支持单例模式
1445浏览 • 1回复 待解决
多实例模式下,UIAbility实例间如何进行数据交互
2892浏览 • 1回复 待解决
HarmonyOS 一个tools模块(hsp)有个单例,然后entrye模块和login的模块(hsp) 都想引入tools模块,但是打断点看到,单例实际上是分别创建2次了,这是因为什么?
533浏览 • 1回复 待解决
HarmonyOS ohos.data.preferences 数据存储,使用preferences 单例模式
1411浏览 • 1回复 待解决
单例模式怎么创建?怎么多线程?
3119浏览 • 1回复 待解决
在添加依赖关系时,各个模块独立声明自己的依赖关系。在工程级oh-package.json5中不要添加对HSP的依赖,否则就会出现单实例异常问题。
在每个模块中生命依赖关系样例: