HarmonyOS鸿蒙Next中在回调函数onDataPrepared方法中调用taskpool.Task.sendData,主线程收不到该消息

HarmonyOS鸿蒙Next中在回调函数onDataPrepared方法中调用taskpool.Task.sendData,主线程收不到该消息

await photoAccessHelper.MediaAssetManager.requestImage(context, photoAsset, requestOptions, {
      onDataPrepared: async (imageSource: image.ImageSource, map?: Map<string, string> | undefined): Promise<void> => {
        console.log(`handlePhoto onDataPrepared`)
        taskpool.Task.sendData(HANDLE_PHOTO_ACTION, HANDLE_PHOTO_SUCCESS) // 这里发送,task收不到这个action
      }
    });
// taskpool.Task.sendData(HANDLE_PHOTO_ACTION, HANDLE_PHOTO_SUCCESS) // 这里发送,task可以收到这个action

更多关于HarmonyOS鸿蒙Next中在回调函数onDataPrepared方法中调用taskpool.Task.sendData,主线程收不到该消息的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

更多关于HarmonyOS鸿蒙Next中在回调函数onDataPrepared方法中调用taskpool.Task.sendData,主线程收不到该消息的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,onDataPrepared回调运行在工作线程,直接调用taskpool.Task.sendData会导致跨线程通信问题。需使用TaskPool.PostTask将消息派发到主线程:

import taskpool from '@ohos.taskpool';

class Message implements taskpool.Task {
  run(data: string) {
    // 处理数据逻辑
    return "processed:" + data;
  }
}

function onDataPrepared(data: string) {
  let msg = new Message();
  taskpool.Task.sendData(msg, data).then((result) => {
    // 主线程通过Promise获取结果
  });
}

确保Task类实现run方法,sendData会返回Promise

这个问题是由于HarmonyOS Next中任务线程与回调函数执行环境的差异导致的。在onDataPrepared回调中直接调用taskpool.Task.sendData()时,消息发送的执行上下文可能不在预期的任务线程环境中。

解决方案建议:

  1. 使用主线程的TaskContext来发送消息:

    let taskContext = taskpool.Task.getTaskContext();
    await photoAccessHelper.MediaAssetManager.requestImage(context, photoAsset, requestOptions, {
      onDataPrepared: async (imageSource: image.ImageSource, map?: Map<string, string> | undefined): Promise<void> => {
        console.log(`handlePhoto onDataPrepared`)
        taskContext.sendData(HANDLE_PHOTO_ACTION, HANDLE_PHOTO_SUCCESS)
      }
    });
    
  2. 或者使用延迟发送机制:

    await photoAccessHelper.MediaAssetManager.requestImage(context, photoAsset, requestOptions, {
      onDataPrepared: async (imageSource: image.ImageSource, map?: Map<string, string> | undefined): Promise<void> => {
        console.log(`handlePhoto onDataPrepared`)
        setTimeout(() => {
          taskpool.Task.sendData(HANDLE_PHOTO_ACTION, HANDLE_PHOTO_SUCCESS)
        }, 0)
      }
    });
    

这两种方式都能确保消息在正确的线程上下文中发送。第一种方式更直接,第二种方式通过事件循环机制将发送操作推迟到下一个tick执行。

回到顶部