obtain系列方法:
message实现了一系列obtain方法,其中核心的方法为obtain()
其他方法只是调用这个基础方法,并在此基础上进行赋值。
此方法的关键设计在于,通过资源池将消息缓存起来,减少不停的提取消息造成的对象创建的开销。这个资源池不是默认创建好的,而是在回收的过程中建立起来的,这个在recycle方法中可以看到。
public static Message obtain() {
synchronized (sPoolSync) {
/*资源池中是否有已经创建的对象*/
if (sPool != null) {
Message m = sPool;
sPool = m.next;
m.next = null;
sPoolSize--;
/*提取出资源池中对象*/
return m;
}
}
/*如果资源池中没有对象,则创建一个*/
return new Message();
}
recycle方法:
message对象使用完后,调用此方法进行消息回收。这个回收的设计非常巧妙。
它将不再使用的消息,缓存最多MAX_POOL_SIZE = 50个在资源池中,以供下次使用。免去了大量对象创建的开销。
public void recycle() {
clearForRecycle();
synchronized (sPoolSync) {
if (sPoolSize < MAX_POOL_SIZE) {
next = sPool;
sPool = this;
sPoolSize++;
}
}
}
Parcelable接口实现:
实现Parcelable定义的接口函数, Parcelabe机制后续分析。
方法 | 实现 |
---|---|
writeToParcel | 将what/arg1/arg2/obj/obj/when/data/replyTo依次写入Parcel |
readFromParcel | 将what/arg1/arg2/obj/obj/when/data/replyTo依次从Parcel读出 |
Set/Get系列方法:
与标准的Set/Get一样,提供基础的获取message成员变量的方法:
方法 | 功能 |
---|---|
setAsynchronous | 设置异步 |
setData | 设置data |
getWhen | 获取时间 |
setTarget | 设置目标 |
getTarget | 获取目标 |
getCallback | 获取回调 |
getData | 获取data |
isAsynchronous | 查询是否异步 |
markInUse | 设置消息已被使用 |
isInUse | 查询消息是否已被使用 |