所以我有一个服务,可以通过信使在远程进程上发送消息,并在应用程序的进程中接收消息
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()
从全局池中返回一个新的Message实例。允许我们在许多情况下避免分配新对象。
https://developer.android.com/reference/android/os/Message#obtain((
Handler
处理完消息后,它将返回到池中。其状态将被清除,以便可以再次使用相同的Message
对象。因此,永远不要在处理程序完成后尝试访问Message
对象。
在对handleMessage()
的调用已经完成之后,您的协同程序在一个单独的线程中运行。这意味着,当协同程序运行时,消息可能已经被回收并返回到池中。