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

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