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多线程下使用单例会创建多份实例
493浏览 • 1回复 待解决
单例在hsp中存在多个的情况
190浏览 • 1回复 待解决
HarmonyOS Entry和Hsp中创建的单例失效
359浏览 • 1回复 待解决
首选项获取实例,实例是否为单例
1863浏览 • 1回复 待解决
ArkTS层实例化与单例介绍
2603浏览 • 1回复 待解决
实现单例模式下的数据存储
895浏览 • 1回复 待解决
HarmonyOS 单例模式拿不到类的对象
226浏览 • 1回复 待解决
HarmonyOS ohos.data.preferences 数据存储,使用preferences 单例模式
46浏览 • 1回复 待解决
HarmonyOS hsp module 在多target模式下中获取rawfile资源失败
102浏览 • 1回复 待解决
请问当前页面跳转时是否支持单例模式
582浏览 • 1回复 待解决
多实例模式下,UIAbility实例间如何进行数据交互
1792浏览 • 1回复 待解决
单例模式怎么创建?怎么多线程?
214浏览 • 1回复 待解决
创建的单例换了页面后不生效问题
2115浏览 • 3回复 待解决
HarmonyOS IjkMediaPlayer目前仅提供单例模式,是否可以支持创建多个?
395浏览 • 1回复 待解决
HarmonyOS Debug期间在涉及到单例的执行链条中总会出现类似日志如下
335浏览 • 1回复 待解决
关于文档中说har中不能用单例的疑惑
1738浏览 • 1回复 待解决
HarmonyOS 单例对象如何实现
306浏览 • 1回复 待解决
如何获取单例为undefined
336浏览 • 1回复 待解决
HarmonyOS 如何在har类型的组件中定义单例
386浏览 • 1回复 待解决
ArkTS的单例模式下判空逻辑会执行两次是什么回事
504浏览 • 1回复 待解决
HarmonyOS 如何构建跨动态库的单例?
206浏览 • 1回复 待解决
HAR包内的单例对象与HAR包相互之间依赖关系问题。
801浏览 • 1回复 待解决
HarmonyOS 依赖同一个组件,不同版本,编译后,出现引用多份同一个组件的情况
369浏览 • 1回复 待解决
HarmonyOS 单UIAbility多page的形式,横竖屏切换相互影响问题
316浏览 • 1回复 待解决
HarmonyOS Navigation组件下多har/hsp间路由跳转依赖耦合问题
449浏览 • 1回复 待解决
在添加依赖关系时,各个模块独立声明自己的依赖关系。在工程级oh-package.json5中不要添加对HSP的依赖,否则就会出现单实例异常问题。
在每个模块中生命依赖关系样例: