鸿蒙Next worker如何通过message传递对象数据

在鸿蒙Next开发中,Worker线程如何通过Message对象传递复杂数据结构?我尝试直接传递自定义对象时遇到序列化问题,请问正确的实现方式是什么?是否需要实现Parcelable接口或采用其他序列化方案?能否提供具体示例代码说明如何在工作线程和主线程间安全传递对象数据?

2 回复

鸿蒙Next里用MessageParcel传对象,就像打包快递一样简单!先序列化对象,塞进MessageParcel,对面收到后反序列化拆包。记住:对象得实现Parcelable接口,不然系统会懵圈:“这啥玩意儿?”(代码版:writeSequenceable()写,readSequenceable()读)

更多关于鸿蒙Next worker如何通过message传递对象数据的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在鸿蒙Next中,使用Worker通过Message传递对象数据时,对象必须支持序列化(实现Parcelable接口)。以下是步骤和示例代码:

1. 定义可序列化对象

import ohos.utils.Parcel
import ohos.utils.Sequenceable

class MyData(val name: String, val value: Int) : Sequenceable {
    override fun marshalling(parcel: Parcel): Boolean {
        parcel.writeString(name)
        parcel.writeInt(value)
        return true
    }

    override fun unmarshalling(parcel: Parcel): Boolean {
        name = parcel.readString() ?: ""
        value = parcel.readInt()
        return true
    }
}

2. 主线程发送消息

val worker = Worker("myWorker")
val message = Message(0, MyData("test", 100))
worker.sendMessage(message)

3. Worker线程处理消息

class MyWorker : Worker("myWorker") {
    override fun onMessageReceived(message: Message) {
        val myData = message.obj as? MyData
        myData?.let {
            // 处理数据
            println("Received: ${it.name}, ${it.value}")
        }
    }
}

注意事项:

  1. 对象必须实现Sequenceable接口
  2. 确保序列化/反序列化逻辑正确
  3. 传递的数据量不宜过大
  4. 类型转换时使用安全转换(as?)

这种方式适用于在Worker线程和主线程之间传递结构化数据。

回到顶部