Message.obtain() in Android



所以我有一个服务,可以通过信使在远程进程上发送消息,并在应用程序的进程中接收消息

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
}
} 
}

我发现msgDatamsg.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()的调用已经完成之后,您的协同程序在一个单独的线程中运行。这意味着,当协同程序运行时,消息可能已经被回收并返回到池中。

相关内容

  • 没有找到相关文章

最新更新