在线程,视图或活动之间发送消息时,有两种看似相同的方式。
第一个,也是最直观的,是obtain
和Message
,然后使用Handler
的sendMessage
方法:
Message msgNextLevel = Message.obtain();
msgNextLevel.what = m.what;
mParentHandler.sendMessage(msgNextLevel);
或者,您可以obtain
提供Handler
的邮件,然后使用Message
的{{3}}方法:
Message msg = Message.obtain(parentHandler);
msg.what = 'foo';
msg.sendToTarget();
为什么存在这两种实现相同目标的方法?他们的行为有何不同?
答案 0 :(得分:3)
如果您从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();
}
提供的解释也非常好:
从全局池返回一个新的Message实例。允许我们避免 在许多情况下分配新对象。
对obtain(Handler h)
执行相同操作:
public static Message obtain(Handler h) {
Message m = obtain();
m.target = h;
return m;
}
您可以确认obtain(Handler h)
确实 obtain()
,并添加了设置目标Handler
与gets()相同,但在返回的Message上设置目标成员的值。
还有其他一些重载,只需检查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)
希望这有帮助,欢呼!
答案 1 :(得分:0)
消息来自内部池,因此不会产生垃圾收集开销。当您调用Message.obtain(Hanler)时,消息知道处理程序收件人,当您调用msg.sendToTarget()时,它将被传递给该处理程序。你应该考虑使用rxJava库来组织并发而不是Android的Message和Handler类 - 它更方便,你可以用它来做一些复杂的事情。