Lon*_*Rob 6 android android-messaging
在“线程”,“视图”或“活动”之间发送消息时,有两种看似相同的方法。
首先,对我最直观的,就是obtain一个Message,然后使用Handler的sendMessage方法:
Message msgNextLevel = Message.obtain();
msgNextLevel.what = m.what;
mParentHandler.sendMessage(msgNextLevel);
Run Code Online (Sandbox Code Playgroud)
或者,您可以obtain提供消息Handler,然后使用Message的sendToTarget方法:
Message msg = Message.obtain(parentHandler);
msg.what = 'foo';
msg.sendToTarget();
Run Code Online (Sandbox Code Playgroud)
为什么存在实现同一事物的这两种方式?他们的行为不同吗?
例如,如果您从此处检查 Message.java 代码,您将看到
//Sends this Message to the Handler specified by getTarget().
public void sendToTarget() {
target.sendMessage(this);
}
Run Code Online (Sandbox Code Playgroud)
换句话说,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();
}
Run Code Online (Sandbox Code Playgroud)
提供的解释也很好:
从全局池中返回一个新的 Message 实例。允许我们在很多情况下避免分配新对象。
做同样的事情obtain(Handler h):
public static Message obtain(Handler h) {
Message m = obtain();
m.target = h;
return m;
}
Run Code Online (Sandbox Code Playgroud)
您可以通过添加设置目标来确认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)希望这有帮助,干杯!
| 归档时间: |
|
| 查看次数: |
3566 次 |
| 最近记录: |