sendToTarget 和 sendMessage 之间的区别

Difference between sendToTarget and sendMessage

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

第一个,也是对我来说最直观的,是 obtain a Message, then use the Handler's sendMessage 方法:

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

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

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

为什么存在这两种实现同一件事的方法?他们的行为是否不同?

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

如果您检查 Message.java 来自 here 的代码,您将看到

//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();
}

提供的解释也很好:

Return a new Message instance from the global pool. Allows us to avoid allocating new objects in many cases.

obtain(Handler h) 做同样的事情:

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

    return m;
}

你可以确认 obtain(Handler h) 真的 obtain() 添加目标 Handler

Same as obtain(), but sets the value for the target member on the Message returned.

还有其他几个重载,只需检查 Message.java 并搜索 "obtain"

  • 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)
  • ...

希望这对您有所帮助,干杯!