2016-10-04 96 views
2

在线程,视图或活动之间发送消息时,有两种看起来完全相同的方法。sendToTarget和sendMessage之间的区别

首先,对我最直观的,是obtain一个Message,然后使用HandlersendMessage方法:

Message msgNextLevel = Message.obtain(); 
msgNextLevel.what = m.what; 
mParentHandler.sendMessage(msgNextLevel); 

或者,您可以obtain提供Handler消息,然后使用MessagesendToTarget方法:

Message msg = Message.obtain(parentHandler); 
msg.what = 'foo'; 
msg.sendToTarget(); 

为什么实现同样的事情存在的这两种方式?他们的行为有所不同吗?

+3

http://androidxref.com/7.0.0_r1/xref/frameworks/base/core/java/android/os/Message.java#415 – pskink

+0

此外,您不能发送活动之间的消息 – Selvin

+0

@pskink啊哈,所以'sendToTarget'真*是*,'sendMessage'。 'gets()'和'gets(Handler)'有什么关系? – LondonRob

回答

2

如果检查例如从here Message.java代码,你会看到

//Sends this Message to the Handler specified by getTarget(). 


public void sendToTarget() { 
    target.sendMessage(this); 
} 

换句话说,sendToTarget()将使用预先指定的Handler并调用它的sendMessage()

如果您要查找的obtain()方法你会看到:

public static Message obtain() { 
    synchronized (sPoolSync) { 
     if (sPool != null) { 
      Message m = sPool; 
      sPool = m.next; 
      m.next = null; 
      m.flags = 0; // clear in-use flag 
      sPoolSize--; 
      return m; 
     } 
    } 
    return new Message(); 
} 

提供的解释也很好:

从全局池中返回一个新的Message实例。允许我们避免 在很多情况下分配新对象

做同样的obtain(Handler h)

public static Message obtain(Handler h) { 
    Message m = obtain(); 
    m.target = h; 

    return m; 
} 

您可以确认obtain(Handler h)真的与增加设定的目标Handler

同获得()的obtain(),但在返回的消息上设置目标成员的值。

还有其他几个重载,只是检查Message.java并搜索 “获得”

  • obtain(Message orig)
  • obtain(Handler h, Runnable callback)
  • obtain(Handler h, int what)
  • obtain(Handler h, int what, Object obj)
  • obtain(Handler h, int what, int arg1, int arg2)
  • obtain(Handler h, int what, int arg1, int arg2, Object obj)
  • ...

希望这有助于,干杯!

0

消息来自内部池,所以不会有垃圾收集开销。当您调用Message.obtain(Hanler)时,消息知道处理程序收件人以及何时调用msg.sendToTarget(),它将传递给该处理程序。您应该考虑使用rxJava库来组织并发性,而不是Android的Message和Handler类 - 它更方便,您可以使用它来完成一些复杂的事情。

相关问题