HarmonyOS taskpool+@Concurrent 时,全局单利对象无法使用,想问下有什么修改建议?

taskpool.execute(test).then(() => { 
            // 调度结果处理 
            let obj = MyStroage.getInstance().getObj() 
            console.error("222  test ==== test(): " + obj) 
          }) 
@Concurrent 
async function test(aaa: AAA): Promise<void> { 
  let obj = MyStroage.getInstance().getObj() 
  console.error("222  test ==== test(): 我是test函数() " + obj) 
} 
export class MyStroage { 
  static my: MyStroage = new MyStroage() 
  public static getInstance(): MyStroage { 
    return MyStroage.my; 
  } 
  private mObj?:object 
  public save(obj: object) { 
    this.mObj = obj; 
  } 
  public getObj():object | undefined{ 
    console.error("000  test ==== "+this.mObj) 
    return this.mObj 
  } 
}

在test()函数中,无法拿到外部的单例对象,想问一下应该如何处理,方便在test()函数中获取到全局的单例对象。

HarmonyOS
2024-11-04 11:37:11
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
Heiang

​目前的话@Concurrent函数中暂不支持从外部拿对象进行操作。因为线程模型中,TaskPool所在的线程与主线程并不共享一个ArkTS引擎实例(详细线程模型文档可参考:​https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/thread-model-stage-V5

所以在执行MyStroage.getInstance()时,主线程和TaskPool线程不会拿到同一个MyStroage对象。

从TaskPool的应用场景来看,也不推荐在TaskPool中使用和操作全局对象。目前说的是通过单例调用模块功能,这个是支持的。

参考代码:​

// src/main/ets/model/MyStorage.ets 
export class MyStorage { 
  static my: MyStorage = new MyStorage() 
  public static getInstance(): MyStorage { 
    return MyStorage.my; 
  } 
  private mObj?:string = 'asdasd' 
  public save(obj: string) { 
    this.mObj = obj; 
  } 
  public getObj():string | undefined{ 
    console.error("000 test ==== "+this.mObj) 
    return this.mObj 
  } 
}
// 调用处 
// 静态导入 
import { MyStorage } from '../model/MyStorage' 
import { taskpool } from '@kit.ArkTS' 
taskpool.execute(test).then(() => { 
  // 调度结果处理 
  let obj = MyStorage.getInstance().getObj() 
  console.error("222 test ==== test(): " + obj) 
}) 
@Concurrent 
async function test(aaa: object): Promise<void> { 
  // 动态导入 
  import('../model/MyStorage').then((model) => { 
    let obj = model.MyStorage.getInstance().getObj() 
    console.error("222 test ==== test(): 我是test函数() " + obj) 
  }) 
}

​如果没有在主线程与TaskPool线程对同一单例进行修改或需要TaskPool读取主线程单例信息的需求,上述方案不会有问题。如果有,则可以通过@Sendable装饰器实现跨进程传递对象,此传递为引用传递。@Sendable详细文档教程可以参考:​https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-sendable-V5

分享
微博
QQ
微信
回复
2024-11-04 17:06:50
相关问题
taskPool @Concurrent报红
2692浏览 • 1回复 待解决
建议开发使用什么单位
1885浏览 • 1回复 待解决
问下有没有文字滚动动画组件?
347浏览 • 1回复 待解决
问下有没有FA卡片开发的demo参考
3483浏览 • 1回复 待解决
问下有没有什么接口可以做到。
2573浏览 • 1回复 待解决
Mac下有什么好的编程字体?
2538浏览 • 1回复 待解决
修改ForEach使用的数据对象,UI不刷新
1824浏览 • 1回复 待解决