HarmonyOS 鸿蒙Next中在Worker中调用libcurl.so下载文件提示timeout

HarmonyOS 鸿蒙Next中在Worker中调用libcurl.so下载文件提示timeout 同一个文件的URL,使用同样的方式去调用native方法执行下载文件的操作,

如果是在主线程调用native的方法,就可以正常下载。

Button("Click to Download")
  .onClick(() => {
    testNapi.downloadFile(filePath, downloadUrl)
})

如果是在worker里调用native方法,就会提示timeout

workerPort.onmessage = (e: MessageEvents) => {
  const workerMessage = e.data as WorkerMessage;
  testNapi.downloadFile(workerMessage.options.filePath,
    workerMessage.options.downloadUrl);
}

更多关于HarmonyOS 鸿蒙Next中在Worker中调用libcurl.so下载文件提示timeout的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

感谢您的提问,为了更快解决您的问题,麻烦请补充以下信息:

这边使用官方demoNativeSavePicToSandBox: 本示例主要介绍Native如何将网络上的图片及Rawfile中的图片保存到应用沙箱中。 (gitee.com)试了下并没有问题,这边是否可以补全下您的代码看下什么问题呢

//Index.ets 中的修改
 Button($r('app.string.tbn_InternetPicture'))
            .onClick(() => {
              const workerInstance: worker.ThreadWorker = new worker.ThreadWorker('entry/ets/pages/Worker.ets');
              workerInstance.postMessage({type: 'start'})
              workerInstance.onmessage = (event: MessageEvents) => {
                console.info('UI主线程收到消息:', event.data);
              }
              // 10秒后停止worker
              setTimeout(() => {
                workerInstance.postMessage({ type: 'stop' });
              }, 20000);
            })
            .alignSelf(ItemAlign.Center)
            .width(CommonConstants.FULL_PARENT)
//定义的Worker线程调用
// Worker.ets
import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';
import testNapi from 'libentry.so';

const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
let isRunning = false;
workerPort.onmessage = (e: MessageEvents) => {
  const type = e.data.type as string;
  if (type === 'start') {
    if (!isRunning) {
      isRunning = true;
      // 开始常驻任务
      // performTask();
      testNapi.saveImageOfInternet('图片地址', '/data/storage/el2/base/haps/entry/files/', 'internet_image.png',
        ((result: string) => {
          if (result === undefined || result === '') {
            console.info('worker xxx shibai ');
          } else {
            // this.internetSandBoxPath = fileUri.getUriFromPath(result);
            console.info('worker xxx chenggong ');
          }
        }))
    }
  } else if (type === 'stop') {
    isRunning = false;
  }
}
// 模拟常驻任务
function performTask() {
  if (isRunning) {
    // 模拟某个长期运行的任务
    workerPort.postMessage('Worker is performing a task');
    // 1秒后再次执行任务
    setTimeout(performTask, 1000);
  } else {
    workerPort.postMessage('Worker has stopped performing the task');
    workerPort.close();
  }
}

更多关于HarmonyOS 鸿蒙Next中在Worker中调用libcurl.so下载文件提示timeout的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


抱歉,您没有提供需要转换的HTML内容。请提供具体的HTML内容,我将为您转换为Markdown格式。

使用Worker线程调用Native层libcurl.so出现下载超时问题,通常与线程安全配置及网络权限管理有关。

libcurl在多线程环境下需要显式设置CURLOPT_NOSIGNAL,否则可能引发线程阻塞或超时。主线程可能因环境差异未触发该问题,而Worker线程需要严格配置。另外 Worker线程无法直接使用主线程的上下文(UIAbilityContext),若Native方法依赖上下文获取网络权限,则Worker中可能因权限缺失导致超时。

解决方法

1/在Native侧代码中添加下面配置:

// 设置禁用信号处理

curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L); 

// 设置超时时间(单位:秒)

curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10);

curl_easy_setopt(curl, CURLOPT_TIMEOUT, 30);

2/确保ohos.permission.INTERNET权限在module.json5中声明,并通过requestPermissions动态申请(主线程已申请不表示Worker线程自动继承)

3/在Native侧添加全局初始化/清理逻辑:

// 程序启动时调用

curl_global_init(CURL_GLOBAL_ALL);

// 程序退出时清理

curl_global_cleanup();
  1. 检查Worker线程传递的filePath是否具备写入权限,建议使用应用沙箱路径:
const context = getContext(this) as common.UIAbilityContext;

const filePath = context.filesDir + '/download_file.txt'; // 标准文件目录

在HarmonyOS Next中,Worker线程调用libcurl.so下载文件出现timeout可能由网络权限未配置或DNS解析问题导致。请检查config.json中是否已添加ohos.permission.INTERNET权限。同时确认网络请求域名可正常解析,或尝试使用IP地址直接访问以排除DNS问题。

在HarmonyOS Next中,Worker线程与主线程的网络访问权限可能存在差异。Worker线程默认可能未配置完整的网络访问能力,导致libcurl.so调用超时。请检查Worker线程的网络权限配置,确保其具备与主线程相同的网络访问策略。此外,验证libcurl在Worker环境中的初始化及资源释放是否正确,避免因线程上下文差异引发超时问题。

回到顶部