HarmonyOS 鸿蒙Next 使用HSP的方式构建基础模块,类的静态变量在APP中非唯一?

发布于 1周前 作者 phonegap100 最后一次编辑是 5天前 来自 鸿蒙OS

App构成的模块使用了Hap, Har, Hsp 几种形式。它们的依赖关系如下: ‘->’ 表示‘依赖于’

A模块 (Hap, app运行单元) -> B模块 (Har) A模块 (Hap, app运行单元) -> C模块 (Hsp)

C模块(Hsp)-> B模块(Har)

在B模块中声明了一个类,它有个静态的成员变量

// B.ets
export class KVStorage {
  static preKV: PreferenceKVStore

  static initialize(context: Context) {
    // 初始化
    if (!KVStorage.preKV) {
      KVStorage.preKV = new PreferenceKVStore(context)
    }
}

在 A模块中调用了KVStorage的初始化方法

// A.ets

KVStorage.initialize(this.context)

A模块执行了上述代码后,在A模块中KVStorage.preKV是符合预期的PreferenceKVStore 对象。 但是,在C模块中调用的时候,发现KVStorage.preKV 是 undefined状态。 debug发现:在A和C模块中,KVStorage 的地址不是同一个。

问题: 在集成HSP的情况下,如何初始化和操作APP运行期间让类静态变量唯一 ? 如果没有办法让类静态变量唯一,有没有其它方式解决上述问题 ?


更多关于HarmonyOS 鸿蒙Next 使用HSP的方式构建基础模块,类的静态变量在APP中非唯一?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复
HAR中的代码和资源跟随使用方编译,如果有多个使用方,它们的编译产物中会存在多份相同拷贝。比如多个HAP引用同一个HAR,其实上是引用了多份HAR,会有多个互不影响的HAR中的单例。

HSP中的代码和资源可以独立编译,运行时在一个进程中代码也只会存在一份。比如多个HAP引用HSP,引用的就是同一个HSP。

所以要想创建一个全局的单例,建议写在HSP中,而不是HAR中。

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/application-package-overview-V5

更多关于HarmonyOS 鸿蒙Next 使用HSP的方式构建基础模块,类的静态变量在APP中非唯一?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,使用HSP(HarmonyOS Service Platform)方式构建基础模块时,类的静态变量在APP中表现出非唯一性,通常是由于以下几个原因:

  1. 进程隔离失效:在HarmonyOS的多进程架构中,如果静态变量在不同进程间被共享而未做隔离处理,会导致数据非唯一。静态变量默认是进程内的,但多进程环境可能通过某些机制(如Binder通信)间接影响。

  2. 单例模式误用:如果基础模块中的类使用了单例模式,且单例的获取方式未考虑多进程情况,可能导致每个进程都认为自己持有的是唯一的单例实例,从而静态变量出现非唯一。

  3. 全局变量管理不当:全局或静态变量的管理未遵循HarmonyOS的模块化设计原则,可能导致变量在不同模块或进程间被重复初始化或修改。

解决此问题,需确保静态变量的使用场景符合HarmonyOS的多进程管理规范,避免跨进程共享静态变量,或在必要时使用HarmonyOS提供的进程间通信机制(如IPC)来正确管理数据同步。

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

回到顶部