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
的消息,然后使用 Message
的 sendToTarget
方法:
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)
- ...
希望这对您有所帮助,干杯!
在线程、视图或活动之间发送消息时,有两种看似相同的方法。
第一个,也是对我来说最直观的,是 obtain
a Message
, then use the Handler
's 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();
为什么存在这两种实现同一件事的方法?他们的行为是否不同?
消息取自内部池,因此不会有垃圾收集开销。当您调用 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)
- ...
希望这对您有所帮助,干杯!