HarmonyOS 鸿蒙Next 多线程 instanceof 和 sendable比想象中离谱,是bug?还是设定?

HarmonyOS 鸿蒙Next 多线程 instanceof 和 sendable比想象中离谱,是bug?还是设定?

cke_169.png

inputModel 在主线程 new 出来,在taskpool线程里面判断 instanceof 是false. 但是返回主线程后,instanceof还是true

cke_6198.png

newResult 在taskpool线程里面new 出来,所以在这个线程里面instanceof 是 true。在主线程里面是 false


更多关于HarmonyOS 鸿蒙Next 多线程 instanceof 和 sendable比想象中离谱,是bug?还是设定?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

7 回复
import taskpool from '@ohos.taskpool'
import { http } from '@kit.NetworkKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { instance, ResultModel } from '../TaskPoolBean';

@Entry
@ComponentV2
struct NetIndex {
  @Local content: string = 'waiting'

  build() {
    Column() {
      Text(this.content)
    }.size({ width: '100%', height: '100%' })
  }

  private inputModel: ResultModel = new ResultModel()

  aboutToAppear(): void {
    instance.record = 1
    taskpool.execute(loadCategory, this.inputModel).then((obj: Object) => {
      let model = obj as ResultModel
      hilog.debug(0x000000, 'rainrain', 'model == ' + (model instanceof ResultModel))
      this.content = model.success ? ' success' : 'fail'
    })
  }
}

@Concurrent
async function loadCategory(inputModel: ResultModel): Promise<ResultModel> {
  inputModel.content = 'loadCategory request'
  let request: http.HttpRequest = http.createHttp()
  let url = 'https://topbook.cc/webapi/content/category/page?start=0&limit=20'
  let response = await request.request(url, { method: http.RequestMethod.GET, })
  request.destroy()
  let resultText = response.result.toString()
  let result: ResultModel = JSON.parse(resultText)
  let newResult = new ResultModel()
  newResult.success = result.success
  hilog.debug(0x000000, 'rainrain', 'newResult == ' + (newResult instanceof ResultModel))
  return newResult
}

更多关于HarmonyOS 鸿蒙Next 多线程 instanceof 和 sendable比想象中离谱,是bug?还是设定?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


@Sendable export class ResultModel { success: boolean = false content: string = ‘content’ }

@Sendable export class PoolInstance { record: number = 0 }

export let instance = new PoolInstance()

taskpool.execute返回的obj,是经过序列化和反序列化的结果,taskpool.execute 会将任务函数( loadCategory)放到后台线程中执行。 任务函数的返回值会被序列化,然后传递回主线程,它丢失了原始对象的原型链信息。与主线程创建的对象ResultModel 的原型链不一致。

这个结论不太对吧。如果丢失了原始信息,那inputModel通过 loadCategory之后返回出来的obj也应该是false。但运行实测是true.见我问题的第一张图。

能提供下你的demo吗?我本地跑的这个是false

深色代码主题
复制
  aboutToAppear(): void {
    taskpool.execute(loadA,this.inputModel).then((obj:Object) => {
      let model=obj as ResultModel;
      console.log("model ==",model instanceof ResultModel)
    })

代码贴楼下了。然后,我多一句嘴,这个是false还是true,目前取决于,这个Model实例时的线程,如果在主线程new出来的,通过inputModel传进去的,再返回就是true.如果是taskpool执行线程new出来,那就是false

在HarmonyOS鸿蒙Next系统中,多线程环境下的instanceofsendable表现与预期有所不同,这通常不是bug,而是系统特定的设计或行为特性。

instanceof是Java等语言中的操作符,用于检查对象是否是指定类的实例。但在鸿蒙系统中,特别是涉及到多线程和跨线程通信时,对象的实例类型检查可能受到线程间对象引用的传递方式和内存模型的影响。鸿蒙系统采用了与Android和Java虚拟机不同的内存管理机制,因此instanceof在多线程下的行为可能与传统Java虚拟机有所不同。

sendable是鸿蒙系统中用于跨线程通信的概念,它确保了对象或消息可以在线程间安全传递。当对象被标记为sendable时,它符合鸿蒙系统的跨线程通信规范,可以在不同线程间传递而不会引发数据竞争或内存泄漏。然而,sendable对象的实例类型检查可能会受到跨线程传递过程中的特殊处理影响。

因此,在鸿蒙系统中,多线程环境下的instanceofsendable行为可能与预期有所不同,这更多是由于系统设计特性和内存管理机制导致的。如果开发者在使用这些特性时遇到问题,建议深入理解鸿蒙系统的多线程和跨线程通信机制。

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

回到顶部