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

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

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

或者,您可以对提供obtain的消息进行Handler,然后使用Message sendToTarget 方法:
Message msg = Message.obtain(parentHandler);
msg.what = 'foo';
msg.sendToTarget();

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

最佳答案

如果您查看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();
}

提供的解释也很好:



obtain(Handler h)做同样的事情:
    public static Message obtain(Handler h) {
    Message m = obtain();
    m.target = h;

    return m;
}

您可以通过设置目标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)
  • ...

  • 希望这会有所帮助,加油!

    关于android - sendToTarget和sendMessage之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39847192/

    10-11 20:09