HarmonyOS 鸿蒙Next worker的使用问题

HarmonyOS 鸿蒙Next worker的使用问题

我有一个文件上传upload

export class Upload {
uploadImageFiled(buff: ArrayBuffer): Promise<UploadImageInfo> {
return new Promise((resolve, reject) => {
// 方式二:request.agent
// 获取应用文件路径
console.info(------- uploadImageFiled --------)
let context = getContext(this) as common.UIAbilityContext
console.info(------- context --------)
let cacheDir = context.cacheDir
let fmt = getImageTypeFromArrayBuffer(buff)
let media_type = mediaType(fmt)
let name = systemDateTime.getTime() + ‘.’ + fmt
let path = cacheDir + /${name}

// 新建一个本地应用文件
let file = fs.openSync(path, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
//console.info(openSync file:${file})
let done = fs.writeSync(file.fd, buff)

if (done === null) {
let info: UploadImageInfo = {
data: undefined,
success: false,
reason: ‘开启上传任务失败 err’ + ‘文件写入失败’,
mediaType: media_type,
mineType: fmt
}
console.info(开启上传任务失败 err 文件写入失败)
reject(info)
}
//console.info(writeSync done:${done})
fs.closeSync(file)

let attachments: Array<request.agent.FormItem> = [{
name: media_type === ‘image’ ? ‘file[]’ : ‘file’,
value: [
{
filename: name,
path: path,
mimeType: media_type === ‘image’ ? image/${fmt} :video/${fmt},
},
]
}]


let config: request.agent.Config = {
action: request.agent.Action.UPLOAD,
url: media_type === ‘image’ ? ‘xxx’ : ‘xxxxx’,
mode: request.agent.Mode.FOREGROUND,
overwrite: true,
method: “POST”,
data: attachments,
headers: {
‘Content-Type’: ‘multipart/form-data’,
}
}

try {
request.agent.create(context, config).then((task: request.agent.Task) => {
task.on(‘progress’, async (progress) => {
console.warn(/Request upload status ${progress.state}, uploaded ${progress.processed} ,size:${progress.sizes[0]} , state:${progress.state})
})
task.on(‘completed’, async (progress: request.agent.Progress) => {
let extras = progress.extras as Record<string, string>
//console.warn(/Request upload completed data:${JSON.stringify(extras)})
let body = JSON.parse(extras.body) as Record<string, number | string | DataItem[] | DataItem >
let bodyData = body.data as DataItem[] | DataItem
//console.info(bodyData is :${JSON.stringify(bodyData)})
task.off(‘completed’)
task.off(‘failed’)
task.off(‘progress’)
//fs.unlinkSync(path)
console.info(临时文件已删除 path:${path})
let info: UploadImageInfo = {
data: Array.isArray(bodyData) ? bodyData : [bodyData],
success: true,
reason: undefined,
mediaType: media_type,
mineType: fmt
}
console.info(开启上传任务失败 err :${JSON.stringify(progress)})
resolve(info)
})
task.on(‘failed’, (progress: request.agent.Progress) => {
console.error(上传任务失败 err:${JSON.stringify(progress)})
task.off(‘completed’)
task.off(‘failed’)
task.off(‘progress’)
let info: UploadImageInfo = {
data: undefined,
success: false,
reason: ‘开启上传任务失败 err’ + JSON.stringify(progress),
mediaType: media_type,
mineType: fmt
}
console.info(开启上传任务失败 err :${JSON.stringify(progress)})
reject(info)
})
task.start((err: BusinessError) => {
console.info(开启任务是否成功 err:${JSON.stringify(err)})
})
console.info(task : ${JSON.stringify(task)})
}).catch((err: BusinessError) => {
let info: UploadImageInfo = {
data: undefined,
success: false,
reason: ‘开启上传任务失败 err’ + JSON.stringify(err),
mediaType: media_type,
mineType: fmt
}
console.info(开启上传任务失败 err :${JSON.stringify(err)})
reject(info)
})
} catch (err) {
let info: UploadImageInfo = {
data: undefined,
success: false,
reason: ‘开启上传任务失败 err’ + JSON.stringify(err),
mediaType: media_type,
mineType: fmt
}
console.info(开启上传任务失败 err :${JSON.stringify(err)})
reject(info)
}
})
}

}

我新建了一个worker,主要内容是

workerPort.onmessage = async (e: MessageEvents) => {
console.warn(接收到上传视频信息 data:${JSON.stringify(e.data)})
const param = e.data as UploaderWorkerParams
const file = fileIo.openSync(param.videoPath,fileIo.OpenMode.READ_WRITE)
const stat = fileIo.statSync(file.fd)
console.warn(视频的长度:${stat.size})
let buff = new ArrayBuffer(stat.size)
fileIo.readSync(file.fd,buff)
fileIo.closeSync(file.fd)
const upload = new Upload()
const coverInfo: UploadImageInfo = await upload.uploadImageFiled(buff)
console.info(video 上传情况:${JSON.stringify(coverInfo)})


}

----------------------------

为什么代码执行到了

console.info(------- uploadImageFiled --------)

这一句之后就没有往下执行?

没有打印  console.info(------- context --------)

是worker里面不能使用  let context = getContext(this) as common.UIAbilityContext 吗?

一直搞不懂这个context是个啥


更多关于HarmonyOS 鸿蒙Next worker的使用问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在worker线程中不支持直接使用getContext接口获取主线程的context信息,主线程和worker线程的上下文不一致。需要访问系统服务和资源时,要将主线程的context发送消息的方式传输到worker线程中。参考以下示例:

主线程

import { worker } from '@kit.ArkTS';
const workerInstance = new worker.ThreadWorker("entry/ets/pages/workers/worker1.ets");
[@Entry](/user/Entry)
[@Component](/user/Component)
struct Index {
  [@State](/user/State) message: string = 'Hello World';
  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
        Button("向worker发送消息").onClick(()=>{
          let con: Context= getContext()
          workerInstance.postMessage(con);
        })
      }.width('100%')
    }.height('100%')
  }
}<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

worker线程

import worker, { MessageEvents, ErrorEvent } from '@ohos.worker';
import { Context } from '@ohos.abilityAccessCtrl';
// 创建worker线程中与主线程通信的对象
const workerPort = worker.workerPort
// worker线程接收主线程信息
workerPort.onmessage = (e: MessageEvents): void => {
  let con: Context = e.data;
  console.error("ctest show worker监听到消息worker.ets onmessage"+con.filesDir)
}
// worker线程发生error的回调
workerPort.onerror = (err: ErrorEvent) => {
  console.log("worker.ets onerror" + err.message);
}<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

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


HarmonyOS 鸿蒙Next worker主要用于管理和调度系统资源,确保多任务高效运行。针对Next worker的使用问题,以下是一些直接相关的解答:

  1. 启动Next worker: Next worker的启动依赖于系统调度策略,开发者无需手动启动。系统会根据任务优先级和资源状态自动分配Next worker。

  2. 任务分配: Next worker负责处理中低优先级任务,高优先级任务由系统优先调度到前台worker。开发者需确保任务优先级设置合理,以充分利用Next worker。

  3. 资源限制: Next worker在运行时会受到系统资源限制,如CPU时间片、内存等。开发者需关注任务资源需求,避免超出限制导致任务被挂起或终止。

  4. 状态监控: 系统提供API供开发者监控Next worker状态,包括任务执行情况、资源使用情况等。开发者可利用这些API进行性能调优和故障排查。

  5. 异常处理: Next worker在遇到异常时,系统会尝试进行恢复。若恢复失败,任务将被终止。开发者需关注异常处理机制,确保任务在异常情况下能够正确恢复或终止。

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

回到顶部