为了避免对象频繁创建销毁带来的开销,可以采用一个pool来维护这些对象,对象使用后可重新放到pool中被重新使用。
Message是一个被频繁使用的对象,因此Message提供了一个message pool。下面是message pool的实现。
obtain方法用来从pool中获取一个Message对象,一旦消息被处理后可以调用recycle方法将该对象放入pool。即使message是通过new方式创建的,仍然可以放入pool中进行回收。
下面的pool实际上是一个stack,obtain是pop, recycle是pop,只是比较简单,仅仅通过一个可以链到下一个message的message 对象记录栈顶。
public final class Message implements Parcelable {
// memebers
public int what;
…
/*package*/ Message next;
private static Object mPoolSync = new Object();
private static Message mPool;
private static int mPoolSize = 0;
private static final int MAX_POOL_SIZE = 10;
public Message() {
}
public static Message obtain() {
synchronized (mPoolSync) {
if (mPool != null) {
Message m = mPool;
mPool = m.next;
m.next = null;
return m;
}
}
return new Message();
}
public void recycle() {
synchronized (mPoolSync) {
if (mPoolSize < MAX_POOL_SIZE) {
clearForRecycle();
next = mPool;
mPool = this;
}
}
}
/*package*/ void clearForRecycle() {
what = 0;
…
}
…
}