HarmonyOS 鸿蒙Next 线程间如何共享类对象(引用方式)

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

HarmonyOS 鸿蒙Next 线程间如何共享类对象(引用方式)

线程间如何共享类对象(引用方式)

开发一款sdk,集成sdk的app传入context和callback,sdk保存context和callback,context用来访问本地文件等操作,callback用来跟app通信。

遇到的问题:

        context和callback使用“static”修饰符修饰存储后,sdk使用taskpool跳转到子线程后,无法在子线程访问context和callback,而且这两个实例无法通过taskpool传参(目前的taskpool的传参需要SendableClass类型并且是克隆方式),请问如何在多线程之间共享context和callback?


更多关于HarmonyOS 鸿蒙Next 线程间如何共享类对象(引用方式)的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

不支持通过全局函数getContext获取上下文,只能通过传递参数的方法将context传递过去。

参考:

[@Concurrent](/user/Concurrent)

function downloadFile(context: Context) {

 let downloadTask: request.DownloadTask;

 try {

   let filePath = context.cacheDir + “/” + systemDateTime.getTime() + “.png”;

   console.info("[downloadFile] filePath :" + filePath)

   request.downloadFile(context, {

     url: ‘https://www.baidu.com/img/flexible/logo/pc/peak-result.png’,

     filePath: filePath

   }, (err: BusinessError, data: request.DownloadTask) => {

     if (err) {

       console.error([downloadFile] Failed to request the download. Code: ${err.code}, message: ${err.message});

       return;

     }

     downloadTask = data;

     let completeCallback = () => {

       console.info(’[downloadFile] Download task completed.’);

     };

     let pauseCallback = () => {

       console.info(’[downloadFile] Download task pause.’);

     };

     let removeCallback = () => {

       console.info(’[downloadFile] Download task remove.’);

     };

     let failCallback = (err: number) => {

       console.error([downloadFile] Failed to download the task. Code: ${err});

     };

     downloadTask.on(‘fail’, failCallback);

     downloadTask.on(‘remove’, removeCallback);

     downloadTask.on(‘pause’, pauseCallback);

     downloadTask.on(‘complete’, completeCallback);

   });

 } catch (err) {

   console.error([downloadFile] Failed to request the download. err: ${JSON.stringify(err.message)});

 }

}

taskpoolContext() {

 let task: taskpool.Task = new taskpool.Task(downloadFile, getContext(this));

 taskpool.execute(task)

}

更多关于HarmonyOS 鸿蒙Next 线程间如何共享类对象(引用方式)的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next系统中,线程间共享类对象(引用方式)主要通过全局变量、智能指针(如果适用)或者线程安全的数据结构来实现。

  1. 全局变量: 可以使用全局变量或者静态变量来在线程间共享对象。这种方法简单直接,但需要确保访问时的同步,避免数据竞争。

  2. 智能指针(如果适用): 在某些情况下,如果对象需要动态管理生命周期,可以使用智能指针(如std::shared_ptr,但注意鸿蒙系统不直接支持C++标准库,这里仅作为概念说明)。智能指针可以自动管理对象的生命周期,并在线程间安全地共享对象引用。不过,鸿蒙开发更多依赖于其自有的内存管理机制。

  3. 线程安全的数据结构: 使用鸿蒙系统提供的线程安全的数据结构,如消息队列、互斥锁、信号量等,来同步对共享对象的访问。这些机制可以确保多个线程在访问共享资源时不会发生数据竞争。

在鸿蒙Next系统中,具体实现方式可能会依赖于所使用的编程语言和框架。通常,鸿蒙的SDK会提供相关的API和示例代码来帮助开发者实现线程间的数据共享。

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

回到顶部