使用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()也可能是合理的。在选择时,你应该考虑你的应用的具体需求和性能目标。