HarmonyOS 鸿蒙Next跨包使用单例模式调用方获取实例为空

发布于 1周前 作者 eggper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next跨包使用单例模式调用方获取实例为空

  1. 在模块A(shared模式)的文件中创建一个单例,并导出供其他模块调用;代码如下:
private static instance: SingleManager 

public static getInstance() :SingleManager {
  if (!SingleManager.instance) {
    SingleManager.instance = new SingleManager()
  }
  return SingleManager.instance
}
  1. 在EntryAbility中调用并执行初始化,代码如下
SingleManager.getInstance().init("40836cedbc74a2e786d682b201c6ab70",this.context)
  1. 在模块B中引入模块A,并获取单例对象
locationManager :SingleManager= SingleManager.getInstance() 

经过断点测试发现,后模块B中执行getInstance时,SingleManager.instance依然为空,重新创建了实例


更多关于HarmonyOS 鸿蒙Next跨包使用单例模式调用方获取实例为空的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

单例只有在同一个流程中才有效,换了页面后之前的实例都全是undefined。

对于每个Page都会生成一个js文件,定义的单例会在每个js中都生成一份,所以单例的作用范围只是Page的范围。

如果想共享一个实例,创建范围需要提升至UIAbility或者App级别

请参考官方文档链接:

https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs-V5/faqs-arkui-75-V5

除了多线程使用单例和单例所在har同时被hap和hsp引用等特殊情况,单例对象在应用的生命周期中是唯一

而上面提供的方案就是用来避免单例跨包使用时重复创建的。

更多关于HarmonyOS 鸿蒙Next跨包使用单例模式调用方获取实例为空的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


如何创建唯一的单例啊

我的提问第一块代码就是创建单例,加个class{}包装一下就行,

针对HarmonyOS鸿蒙Next跨包使用单例模式调用方获取实例为空的问题,可能的原因及解决方案如下:

在鸿蒙系统中,如果跨包(即不同模块或应用包)使用单例模式时遇到实例为空的情况,这通常是由于单例类的实例化方式或访问权限设置不当导致的。单例模式确保一个类仅有一个实例,并提供一个全局访问点来获取该实例。但在跨包场景下,若单例类的实例化逻辑或访问控制未正确处理,可能导致调用方无法正确获取实例。

解决此问题的一种方法是确保单例类的实例化逻辑在跨包访问时是可见的,并且实例的创建和访问是线程安全的。具体来说,可以检查以下几点:

  1. 确保单例类使用静态变量存储唯一实例,并提供静态方法访问该实例。
  2. 检查单例类的构造函数是否为私有,以防止外部通过new关键字创建多个实例。
  3. 如果涉及多线程环境,确保单例的创建是线程安全的,可以使用双重检查锁定等机制。
  4. 检查跨包访问时是否存在类加载器或权限问题,确保单例类在跨包时能够被正确加载和访问。

如果问题依旧没法解决请联系官网客服, 官网地址是 https://www.itying.com/category-93-b0.html

回到顶部