Message的创建方法有如下三种:
1、通过 Handler实例获取,Message message = myHandler.obtainMessage();
2、通过 Message获取,Message message = Message.obtain();
3、直接创建新的Message实例Message message = new Message();
下面分别进行分析:
Handler obtainMessage
通过 Handler 实例获取,Message message = myHandler.obtainMessage():
//freameworks/base/core/java/android/os/Handler.java
public class Handler {
public final Message obtainMessage()
{
return Message.obtain(this);
}
}
调用Message的obtain方法:
//freameworks/base/core/java/android/os/Message.java
public final class Message implements Parcelable {
public static Message obtain(Handler h) {
Message m = obtain();
m.target = h;
return m;
}
}
调用obtain方法:
//freameworks/base/core/java/android/os/Message.java
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();
}
}
通过new的方式创建Message对象,Message的构造方法我们后面介绍。
Message obtain
通过 Message 获取,Message message = Message.obtain();
//freameworks/base/core/java/android/os/Message.java
public final class Message implements Parcelable {
public static Message obtain(Message orig) {
Message m = obtain();
m.what = orig.what;
m.arg1 = orig.arg1;
m.arg2 = orig.arg2;
m.obj = orig.obj;
m.replyTo = orig.replyTo;
m.sendingUid = orig.sendingUid;
m.workSourceUid = orig.workSourceUid;
if (orig.data != null) {
m.data = new Bundle(orig.data);
}
m.target = orig.target;
m.callback = orig.callback;
return m;
}
}
调用Message的obtain对象:
//freameworks/base/core/java/android/os/Message.java
public final class Message implements Parcelable {
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();
}
}
通过new的方式创建Message对象:
new Message
前两种方法最后都会通过new的方式创建Message,如下为Message的构造方法:
//freameworks/base/core/java/android/os/Message.java
public final class Message implements Parcelable {
public Message() {
}
}
哈哈,构造方法中啥也没有,但调用handler.sendMessage(message)前需要根据需求对Message的如下变量进行赋值:
public int what; //消息代码
public int arg1; //消息参数
public int arg2; //消息参数
public Object obj; //可以存放任意对象
public Messenger replyTo; //可选的 Messenger,可以在其中发送对此消息的回复。