gpt4 book ai didi

android - sendToTarget 和 sendMessage 之间的区别

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:41:56 25 4
gpt4 key购买 nike

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

第一个,也是对我来说最直观的,是 obtain一个Message , 然后使用 HandlersendMessage方法:

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

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

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

提供的解释也很好:

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并搜索“获取”

  • 获取(消息来源)
  • 获取(Handler h,Runnable 回调)
  • 获取(Handler h, int what)
  • 获取(Handler h, int what, Object obj)
  • 获取(处理程序 h,int what,int arg1,int arg2)
  • 获取(Handler h,int what,int arg1,int arg2,Object obj)
  • ...

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com