概括一下:调用recycle()不是为让系统去回收这个对象,而是让对象池(所以类中要有一个对象池静态成员,如:SynchronizedPool<VelocityTracker> sPool)回收这个对象(就是做了隐藏该对象,避免被系统回收的机制),在调用recycle()前需要调用clear(),用于将对象重置到初始化状态。得到这类对象一般通过obtain方法获取,obtain()0一般会从对象池中获取,当对象池的对象都被使用时,若没超多最大容量,则再创建放入对象池中,并返回,若已超过最大容量则就不知道会怎样处理。这是一个类似线程池的设计,但目的有点不一样,对象池是为了让经常被使用,但使用时间不长,避免经常要创建对象重新分配的时候使用的,可以节省时间,这是一个空间换时间的设计,对象池不能太大,否则占内存太多。对象池最合理的容量是,保持在常规状态下,系统用到这类对象的数目大小值即可,这样才能最合理的利用空间,最大的时间获取率(用最小的空间获取更多的时间)。
使用recycle的类保持了一个链表,作为对象池,以一个静态对象作为表头。下面的类的设计是使用完调用recycle就是将对象插入链表头部,如果要对象,就调用obtain从链表头中取。
/**
* Created by Tiou on 2014/7/15.
* 一个实现 Recycle 机制的对象
*/
public class Data {
/**
* 对象池,就是上文所提到的对象仓库,用于暂时存放不用的对象。
* 用链表来实现对象池结构,直观,高效,易用。
* sPool 便是指向链表头部的引用
*/
private static Data sPool;
/**
* 指向链表中的下一个元素,当 next 为 null 时表示已到达链表末端
*/
private Data next;
/**
* 隐藏构造函数,避免对象被 new 关键字创建
*/
private Data(){}
/**
* 从池里获取一个新对象,没有的话则返回一个新的实例
* @return 可用的新对象
*/
public static Data obtain(){
if(sPool!=null){ // 池中有可用的对象
// 对于对象池来说顺序并没有关系
// 这里取链表的第一个对象,主要是因为方便
Data data = sPool;
sPool = sPool.next;
data.next = null;
return data;
}
return new Data();
}
/**
* 将当前对象回收,一旦对象被回收,便不能再使用,代码中也不应存有任何到该对象的引用
*/
public void recycle(){
clear(); //清理对象
// 把当前对象作为首元素按入链表中
next = sPool;
sPool = this;
}
/**
* 重置对象到刚初始化时的状态
*/
private void clear(){
}
}
http://dourok.info/2014/07/15/quick-overview-of-recycling-pattern-in-android/