sendToTarget和sendMessage

时间:2016-10-04 08:04:28

标签: android android-messaging

在线程,视图或活动之间发送消息时,有两种看似相同的方式。

第一个,也是最直观的,是obtainMessage,然后使用HandlersendMessage方法:

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

或者,您可以obtain提供Handler的邮件,然后使用Message的{​​{3}}方法:

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

为什么存在这两种实现相同目标的方法?他们的行为有何不同?

2 个答案:

答案 0 :(得分:3)

如果您从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)确实 obtain(),并添加了设置目标Handler

  

与gets()相同,但在返回的Message上设置目标成员的值。

还有其他一些重载,只需检查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)
  • ...

希望这有帮助,欢呼!

答案 1 :(得分:0)

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