HarmonyOS 鸿蒙Next从底层频繁回调到JS,保存的数据有问题

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

HarmonyOS 鸿蒙Next从底层频繁回调到JS,保存的数据有问题 1、把一包包音频数据从JS传到C层,然后解码,最后返回JS保存成文件。 2、这是一个循环过程,每包数据间隔是10-30ms。 3、结果JS保存的数据是有问题的,而在回调前,在C层保存没问题。

C代码片段:

static int decode_stream_output(void *buf, int size, void *priv) {
    NapiContext *napiContext = (NapiContext *)priv;
    CallbackContext *callbackContext = (CallbackContext *)malloc(sizeof(CallbackContext));
    callbackContext->size = size;
    callbackContext->buf = (unsigned char *)malloc(sizeof(unsigned char) * size);
    memcpy(callbackContext->buf, buf, size);
    
    fwrite(callbackContext->buf, 1, callbackContext->size, fout);//在这保存的数据没问题
    
    napi_acquire_threadsafe_function(napiContext->threadSafeFunc);
    napi_call_threadsafe_function(napiContext->threadSafeFunc, callbackContext, napi_tsfn_blocking);
    
    return 0;
}

JS代码片段:

let listener: OnStreamDecodeListener = {
    onDecoded: (outData: ArrayBuffer): void => {
        writeStream.write(outData).then((writeSize) => {//保存的数据有问题
            writeStream.flush();
        })
    }
}
nativeAPI.setOnStreamDecodeListener(listener)

更多关于HarmonyOS 鸿蒙Next从底层频繁回调到JS,保存的数据有问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

调用 writeStream.write(outData) 函数时,Node.js 会尝试将数据写入流,但不会等待写入操作完成就继续执行后面的代码。在异步 write 的情况下,您可能在数据完全写入之前就调用了 flush 或其他后续操作,导致保存的数据有误。而在同步 writeSync 的情况下,数据完全写入后才会继续执行后续的代码。

您可以在 writeStream.writewriteStream.flush 调用中添加错误处理逻辑捕获并处理可能出现的异常或错误,以验证您的猜想。

关于IR的评论框贴代码您可以勾选左下角Markdown选项,将代码块包裹在 ``` 符号中,就像您在“基本信息”中的写法一样(这块我们不可编辑,不清楚是否支持markdown),效果如下:

writeStream.write(outData).then((writeSize) => { //保存的数据有问题
    writeStream.flush(); // 这里是在then之后才调用flush
})

更多关于HarmonyOS 鸿蒙Next从底层频繁回调到JS,保存的数据有问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对“HarmonyOS 鸿蒙Next从底层频繁回调到JS,保存的数据有问题”这一问题,可能的原因及解决方案如下:

原因:

  1. 数据同步问题:底层与JS层之间的数据同步可能存在延迟或冲突,导致数据在传输过程中被覆盖或丢失。
  2. 回调机制缺陷:频繁的回调可能导致资源竞争或数据状态不一致,进而影响数据的保存。
  3. 存储机制问题:JS层或底层存储数据时可能存在逻辑错误或性能瓶颈,导致数据保存不正确。

解决方案:

  1. 优化数据同步机制:确保底层与JS层之间的数据同步是可靠的,可以考虑使用事务机制或加锁策略来避免数据冲突。
  2. 调整回调策略:减少不必要的回调,或优化回调的触发条件,以降低资源竞争和数据状态不一致的风险。
  3. 检查并修复存储逻辑:仔细检查底层和JS层的存储逻辑,确保数据的正确性和完整性。同时,优化存储性能,避免性能瓶颈。

请注意,以上解决方案可能需要根据具体的应用场景和代码实现进行调整。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部