使用new Message()和obtainMessage两种方式得到Message对象有什么区别 ?
参考答案:
在Android开发中,Message
对象经常用于线程间的通信,特别是在处理Handler
和Looper
时。Message
对象可以包含要发送的数据以及处理这些数据的逻辑。
new Message()
和obtainMessage()
这两种方式都可以用来创建Message
对象,但它们之间有一些关键的区别:
-
内存管理:
obtainMessage()
:这是一个从消息池中获取消息对象的方法。Android系统会维护一个消息池,用于复用Message
对象,以减少内存分配和垃圾回收的开销。当你使用obtainMessage()
时,你实际上是从这个池中获取一个已存在的Message
对象(可能是之前用过的),而不是创建一个全新的对象。new Message()
:这会创建一个全新的Message
对象。如果频繁地创建和销毁Message
对象,可能会导致更多的内存分配和垃圾回收,从而影响性能。
-
使用场景:
- 如果你确定你的应用不会频繁地创建和销毁大量的
Message
对象,或者你对内存使用的优化不太关心,那么使用new Message()
可能是简单且直接的选择。 - 然而,在大多数情况下,特别是在性能敏感的应用中,使用
obtainMessage()
是更好的选择,因为它可以帮助减少内存使用和垃圾回收的开销。
- 如果你确定你的应用不会频繁地创建和销毁大量的
-
设置属性:
- 使用
obtainMessage()
获取到的Message
对象可能需要额外的设置,比如设置其what
字段或其他字段,以便在处理消息时能够识别它。 - 使用
new Message()
创建的对象也需要进行类似的设置。
- 使用
-
线程安全:
- 无论是使用
obtainMessage()
还是new Message()
,你都需要注意线程安全的问题。确保在正确的线程(通常是主线程)上处理消息,并避免并发修改的问题。
- 无论是使用
总的来说,obtainMessage()
是更推荐的方式,因为它有助于优化内存使用和性能。然而,在某些特定场景下,使用new Message()
也可能是合理的。在选择时,你应该考虑你的应用的具体需求和性能目标。