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的依赖

HSP中,单例模式出现多份实例问题分析总结_2-鸿蒙开发者社区

6.执行程序,程序输出如下日志。从日志可以看出,

两个value值是不一样的。直接调用”ContextInstance“操作的单例变量和直接调用”CardEventUtils“操作的单例变量

不是同一个

HSP中,单例模式出现多份实例问题分析总结_2-鸿蒙开发者社区

7.为什么会导致这个问题??

当在工程级配置依赖hsp之后,会导致hspA依赖hsp B时直接将两份代码都打包进入hsp A中,没有在hsp A中排除掉hsp B的代码.

HSP中,单例模式出现多份实例问题分析总结_2-鸿蒙开发者社区

HSP中,单例模式出现多份实例问题分析总结_2-鸿蒙开发者社区

HarmonyOS
2024-06-11 19:44:13
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
sdp001

在添加依赖关系时,各个模块独立声明自己的依赖关系。在工程级oh-package.json5中不要添加对HSP的依赖,否则就会出现单实例异常问题。

在每个模块中生命依赖关系样例:

分享
微博
QQ
微信
回复
2024-06-12 15:58:45
相关问题
首选项获取实例实例是否为
580浏览 • 1回复 待解决
ArkTS层实例化与介绍
499浏览 • 1回复 待解决
实现模式下的数据存储
403浏览 • 1回复 待解决
创建的换了页面后不生效问题
699浏览 • 1回复 待解决
关于文档说har不能用的疑惑
395浏览 • 1回复 待解决
HarmonyOS参与者的问题分析
6304浏览 • 4回复 待解决
框架native侧文件读取权限问题
360浏览 • 1回复 待解决
响应时延/掉帧性能问题分析
192浏览 • 1回复 待解决
xargs命令传多个参数实例
7793浏览 • 1回复 待解决
Navigation管理页面堆栈太多问题
502浏览 • 1回复 待解决
证书和设备协作问题
5348浏览 • 1回复 待解决
提问
该提问已有0人参与 ,帮助了0人