HarmonyOS 鸿蒙Next 更新到DP2后,在多线程中测量文本宽度出现问题

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

HarmonyOS 鸿蒙Next 更新到DP2后,在多线程中测量文本宽度出现问题 昨天手机更新到DP2后发现页面经常crash,排查后发现在子线程执行

import measure from '@ohos.measure'
import taskpool from '@ohos.taskpool'

@Concurrent
function multiMeasure(){
  let data:number[] = []
  for (let i = 0; i < 2000; i++) {
    let charWidth = measure.measureText({
      textContent: '我',
      fontSize: 80 + 'px'
    }) * 3
    data.push(charWidth)
  }
  return data;
}

async function asyncMultiMeasure(){
  let task:taskpool.Task = new taskpool.Task(multiMeasure)
  let data:number[] = [];
  data = await taskpool.execute(task) as number[]
  return data;
}


@Component
export struct measureTest{
  @State data:number[] = [0]

  async aboutToAppear(){
   this.data = await asyncMultiMeasure();
    console.log(`MEA-MSG: len:${this.data.length}`)
    this.data.forEach(d => {
      console.log(`MEA-MSG: num:${d}`)
    })
  }

  build() {
    Column(){
      Text(this.data[0].toString())
        .fontSize(20)

    }
  }
}

这是更新后的bug吗?

下面是一个实例代码

import measure from '@ohos.measure'
import taskpool from '@ohos.taskpool'

@Concurrent
function multiMeasure(){
  let data:number[] = []
  for (let i = 0; i < 2000; i++) {
    let charWidth = measure.measureText({
      textContent: '我',
      fontSize: 80 + 'px'
    }) * 3
    data.push(charWidth)
  }
  return data;
}

async function asyncMultiMeasure(){
  let task:taskpool.Task = new taskpool.Task(multiMeasure)
  let data:number[] = [];
  data = await taskpool.execute(task) as number[]
  return data;
}


@Component
export struct measureTest{
  @State data:number[] = [0]

  async aboutToAppear(){
   this.data = await asyncMultiMeasure();
    console.log(`MEA-MSG: len:${this.data.length}`)
    this.data.forEach(d => {
      console.log(`MEA-MSG: num:${d}`)
    })
  }

  build() {
    Column(){
      Text(this.data[0].toString())
        .fontSize(20)

    }
  }
}

Reason: Signal: SIGSEGV(SEGV_MAPERR)@0x0000000000000028 probably caused by NULL pointer dereference


更多关于HarmonyOS 鸿蒙Next 更新到DP2后,在多线程中测量文本宽度出现问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

你好,这个问题建议附上代码通过在线提单进一步解决:https://developer.huawei.com/consumer/cn/support/feedback/#/,感谢您的反馈和支持

更多关于HarmonyOS 鸿蒙Next 更新到DP2后,在多线程中测量文本宽度出现问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


同遇到,咋解决的呢?

没解决捏,

在HarmonyOS鸿蒙Next更新到DP2后,多线程中测量文本宽度出现问题可能是由于系统更新导致的API行为变化或线程同步问题。鸿蒙Next的DP2版本可能对文本渲染或测量逻辑进行了调整,导致在多线程环境下测量文本宽度时出现不一致或错误的结果。具体原因可能涉及以下几个方面:

  1. API变更:DP2版本可能对TextCanvas相关的API进行了修改,导致在多线程中调用时行为不一致。建议检查相关API的文档,确认是否有新的使用限制或参数要求。

  2. 线程同步问题:多线程环境下,如果未正确同步对共享资源的访问,可能会导致测量结果不准确。鸿蒙Next可能对线程管理机制进行了优化或调整,导致原有的线程同步策略失效。

  3. 渲染引擎更新:DP2版本可能对鸿蒙的渲染引擎进行了更新,影响了文本的测量逻辑。特别是在多线程环境下,渲染引擎的行为可能发生变化,导致测量结果与预期不符。

  4. 系统资源管理:鸿蒙Next可能对系统资源的管理方式进行了调整,导致在多线程中测量文本宽度时,资源分配或释放出现问题,进而影响测量结果。

建议检查代码中与文本测量相关的部分,确认是否遵循了最新的API使用规范,并确保在多线程环境下正确同步对共享资源的访问。如果问题持续存在,可以尝试在单线程环境下进行测试,以排除多线程相关的问题。

在HarmonyOS鸿蒙Next DP2版本中,多线程环境下测量文本宽度可能出现问题,可能是由于线程同步或资源竞争导致的。建议检查以下几点:

  1. 确保在UI线程中进行文本测量操作;
  2. 使用TextMeasurer类时,确保线程安全;
  3. 避免在多线程中同时访问共享资源。

如果问题持续,建议提交日志和代码片段给华为开发者支持团队进行进一步分析。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!