跳到主要内容

使用new Message()和obtainMessage两种方式得到Message对象有什么区别 ?

参考答案:

在Android开发中,Message对象经常用于线程间的通信,特别是在处理HandlerLooper时。Message对象可以包含要发送的数据以及处理这些数据的逻辑。

new Message()obtainMessage()这两种方式都可以用来创建Message对象,但它们之间有一些关键的区别:

  1. 内存管理

    • obtainMessage():这是一个从消息池中获取消息对象的方法。Android系统会维护一个消息池,用于复用Message对象,以减少内存分配和垃圾回收的开销。当你使用obtainMessage()时,你实际上是从这个池中获取一个已存在的Message对象(可能是之前用过的),而不是创建一个全新的对象。
    • new Message():这会创建一个全新的Message对象。如果频繁地创建和销毁Message对象,可能会导致更多的内存分配和垃圾回收,从而影响性能。
  2. 使用场景

    • 如果你确定你的应用不会频繁地创建和销毁大量的Message对象,或者你对内存使用的优化不太关心,那么使用new Message()可能是简单且直接的选择。
    • 然而,在大多数情况下,特别是在性能敏感的应用中,使用obtainMessage()是更好的选择,因为它可以帮助减少内存使用和垃圾回收的开销。
  3. 设置属性

    • 使用obtainMessage()获取到的Message对象可能需要额外的设置,比如设置其what字段或其他字段,以便在处理消息时能够识别它。
    • 使用new Message()创建的对象也需要进行类似的设置。
  4. 线程安全

    • 无论是使用obtainMessage()还是new Message(),你都需要注意线程安全的问题。确保在正确的线程(通常是主线程)上处理消息,并避免并发修改的问题。

总的来说,obtainMessage()是更推荐的方式,因为它有助于优化内存使用和性能。然而,在某些特定场景下,使用new Message()也可能是合理的。在选择时,你应该考虑你的应用的具体需求和性能目标。