sendToTarget和sendMessage之间的区别

Lon*_*Rob 6 android android-messaging

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

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

Message msgNextLevel = Message.obtain();
msgNextLevel.what = m.what;
mParentHandler.sendMessage(msgNextLevel);
Run Code Online (Sandbox Code Playgroud)

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

Message msg = Message.obtain(parentHandler);
msg.what = 'foo';
msg.sendToTarget();
Run Code Online (Sandbox Code Playgroud)

为什么存在实现同一事物的这两种方式?他们的行为不同吗?

Hen*_*eMS 6

例如,如果您从此处检查 Message.java 代码,您将看到

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


public void sendToTarget() {
    target.sendMessage(this);
}
Run Code Online (Sandbox Code Playgroud)

换句话说,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();
}
Run Code Online (Sandbox Code Playgroud)

提供的解释也很好:

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

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

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

    return m;
}
Run Code Online (Sandbox Code Playgroud)

您可以通过添加设置目标来确认obtain(Handler h)确实是 obtain()Handler

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

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

希望这有帮助,干杯!