#鸿蒙通关秘籍#如何在HarmonyOS NEXT中通过Native侧实现下载进度同步?

HarmonyOS
7天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
Yvr序章CPM

在HarmonyOS NEXT中,实现下载进度同步的方案如下:

  1. 创建一个前端进度条,使用Progress组件进行绘制:

    Progress({ value: this.progress, total: 100, type: ProgressType.Ring })
        .width($r("app.integer.progress_size"))
        .height($r("app.integer.progress_size"))
        .animation({ duration: NativeProgressNotifyConstants.PROGRESS_ANIMATION_DURATION, curve: Curve.Ease })
        .style({ strokeWidth: 15 })
    
  2. JS侧调用Native侧方法,并传入回调函数用于接收进度信息:

    naitiveprogressnotify.startDownload((data: number) => {
        this.progress = data;
        console.log("[NativeProgressNotify]progress:" + this.progress);
    })
    
  3. 在Native侧,使用std::thread创建子线程执行模拟下载任务,避免占用主线程资源:

    std::thread downloadThread(downloadTask, asyncContext);
    downloadThread.detach();
    
  4. 模拟下载过程中,每100毫秒执行一次uv_queue_work,将异步任务推入事件堆栈:

    while (context && context->progress < 100) {
         context->progress += 1;
         napi_acquire_threadsafe_function(tsfn);
         napi_call_threadsafe_function(tsfn, (void *)context, napi_tsfn_blocking);
         std::this_thread::sleep_for(std::chrono::milliseconds(100));
     }
    
  5. 在该线程中调用napi_call_function以执行ArkTS回调,将进度信息传递给ArkTS侧:

    napi_create_int32(arg->env, arg->progress, &progress);
    napi_call_function(arg->env, nullptr, jsCb, 1, &progress, nullptr);
    
分享
微博
QQ
微信
回复
7天前
相关问题
如何实现下载断点续传
1864浏览 • 0回复 待解决