在“线程”,“ 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/