Message.obtain() 在 Android
Message.obtain() in Android
所以我有一个服务可以通过 Messenger 在远程进程上发送消息并在应用进程中接收消息
messenger.send(
Message.obtain().apply {
data = Bundle().apply {
putString("value", "some random value")
}
}
)
当收到它时,我使用协程 运行 工作线程池中的代码块:
inner class IncomingHandler() : Handler() {
override fun handleMessage(msg: Message) {
val msgData = msg.data
CoroutineScope(Dispatchers.Default + SupervisorJob()).launch {
Log.d("TEST", "${msg.data===msgData}") // false
}
}
}
我发现 msgData 和 msg.data 没有指向同一个对象。 msgData 是我之前发送的消息中的包,但 msg.data 是一个完全空的包。
当我在协同程序(另一个线程)中使用 msg 时,它就像 msg 对另一个对象的引用我不知道如何
Message
个对象在全局池中共享,以尽量避免创建太多新对象。来自文档:
public static Message.obtain()
Return a new Message instance from the global pool. Allows us to avoid allocating new objects in many cases.
https://developer.android.com/reference/android/os/Message#obtain()
消息在 Handler
处理后返回到池中。它的状态将被清除,以便可以再次使用相同的 Message
对象。因此,在处理程序完成后,您永远不应尝试访问 Message
对象。
在对 handleMessage()
的调用已经完成后,您的协程将在单独的线程中运行。这意味着当协程运行时,消息可能已经被回收并返回到池中。
所以我有一个服务可以通过 Messenger 在远程进程上发送消息并在应用进程中接收消息
messenger.send(
Message.obtain().apply {
data = Bundle().apply {
putString("value", "some random value")
}
}
)
当收到它时,我使用协程 运行 工作线程池中的代码块:
inner class IncomingHandler() : Handler() {
override fun handleMessage(msg: Message) {
val msgData = msg.data
CoroutineScope(Dispatchers.Default + SupervisorJob()).launch {
Log.d("TEST", "${msg.data===msgData}") // false
}
}
}
我发现 msgData 和 msg.data 没有指向同一个对象。 msgData 是我之前发送的消息中的包,但 msg.data 是一个完全空的包。
当我在协同程序(另一个线程)中使用 msg 时,它就像 msg 对另一个对象的引用我不知道如何
Message
个对象在全局池中共享,以尽量避免创建太多新对象。来自文档:
public static Message.obtain()
Return a new Message instance from the global pool. Allows us to avoid allocating new objects in many cases.
https://developer.android.com/reference/android/os/Message#obtain()
消息在 Handler
处理后返回到池中。它的状态将被清除,以便可以再次使用相同的 Message
对象。因此,在处理程序完成后,您永远不应尝试访问 Message
对象。
在对 handleMessage()
的调用已经完成后,您的协程将在单独的线程中运行。这意味着当协程运行时,消息可能已经被回收并返回到池中。