HarmonyOS 鸿蒙Next worker间数据传递

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

HarmonyOS 鸿蒙Next worker间数据传递

在使用worker的过程中,主线程通过postMessage(message: Object, options?: PostMessageOptions): void函数向其他线程发送消息,如果传入options参数转移对象所有权,那么还会有16M的限制吗? 我们上传用户图片到服务器前需要对图片进行加密,在worker中执行加密,从主线程传入worker的图片数据超过16M

2 回复
Worker子线程和宿主线程之间的通信是基于消息传递的,Worker通过序列化机制与宿主线程之间相互通信,完成命令及数据交互。序列化传输的数据量大小限制为16MB。关于worker的更多问题可以参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-worker-V5

关于补充问题: 1.使用可转移对象Arraybuffer,没有明确的大小限制 

2.使用Worker模块时,需要在主线程中注册onerror接口,否则当worker线程出现异常时会发生jscrash问题, 参考链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-worker-V5#onerror9

3.参考如下代码获取序列化数据字节数,转换后判断是否大于16M 

import { util } from '@kit.ArkTS'

let textEncoder: util.TextEncoder = new util.TextEncoder();

let uint8array:Uint8Array = textEncoder.encodeInto(this.jsonString) 

const byteArray = Array.from(uint8array); 

console.info(“数据字节数=”+byteArray.length)

更多关于HarmonyOS 鸿蒙Next worker间数据传递的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙系统中,实现Next Worker间的数据传递,可以通过全局变量、消息队列、或者数据绑定等方式来完成。以下是一个使用消息队列(Message Queue)实现Next Worker间数据传递的示例代码:

发送端Worker代码

#include "ohos/aafwk/ability/Ability.h"
#include "ohos/aafwk/ipc/MessageQueueLite.h"
#include "ohos/aafwk/ipc/MessageParcel.h"

using namespace OHOS::AAFwk;

class SenderWorker : public Worker {
public:
    void onStart(const std::shared_ptr<IRemoteObject>& token) override {
        MessageQueueLite::MessageParcel data;
        data.WriteString("Hello from SenderWorker");
        
        MessageQueueLite::Message message;
        message.SetCode(1); // 消息码
        message.SetData(data);
        
        token->SendMessage(message);
    }
};

接收端Worker代码

#include "ohos/aafwk/ability/Ability.h"
#include "ohos/aafwk/ipc/MessageQueueLite.h"
#include "ohos/aafwk/ipc/MessageParcel.h"

using namespace OHOS::AAFwk;

class ReceiverWorker : public Worker, public IRemoteObject::Stub {
public:
    void OnRemoteRequest(uint32_t code, MessageParcel& data, MessageParcel& reply, MessageOption& option) override {
        if (code == 1) {
            std::string message;
            data.ReadString(message);
            // 处理接收到的数据
            // ...
        }
    }
};

注册Worker

在Ability中注册这两个Worker,并启动发送端Worker以发送数据。

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

回到顶部