因为硬件资源的限制,Android在很多地方都使用了Pool的,特别是对于需要通过native的方式调用资源,比如专门用于获取Touch、Flinging以及其他手势速度的VelocityTracker类,文档中指明了调用方式必须是:
// 创建
VelocityTracker mVelocityTracker = VelocityTracker.obtain();
// 回收
mVelocityTracker.recycle();
mVelocityTracker = null;
其内部使用了SynchronizedPool来实现:
public final class VelocityTracker {
private static final SynchronizedPool<VelocityTracker> sPool =
new SynchronizedPool<VelocityTracker>(2);
// 省略其他代码
}
其实现包括三个类和接口:Pool接口, SimplePool类与SynchronizedPool类,其实现代码在android.util.Pools类中。代码结构如下:
Pool接口
public static interface Pool<T> {
public T acquire();
public boolean release(T instance);
}
定义了两个方法,一个从Pool中获取,另一个将对象释放到Pool中,非常简洁。
SimplePool类
public static class SimplePool<T> implements Pool<T> {
private final Object[] mPool;
private int mPoolSize;
public SimplePool(int maxPoolSize) {
if (maxPoolSize <= 0) {
throw new IllegalArgumentException("The max pool size must be > 0");
}
mPool = new Object[maxPoolSize];
}
// ...
}
使用一个Object数组来存放,因此Pool的容量是固定的,因此这里用Object数组是最简单的,如果需要实现可以自动扩展的Pool,大可以将Object数组替换成链表。
SynchronizedPool类
public static class SynchronizedPool<T> extends SimplePool<T> {
private final Object mLock = new Object();
// ...
public T acquire() {
synchronized (mLock) {
return super.acquire();
}
}
public boolean release(T element) {
synchronized (mLock) {
return super.release(element);
}
}
}
这里只是增加了一个锁(mLock),在Java里面任何一个对象都可以当作锁。至于为什么直接用synchronized(this),一般认为synchronized(this)这样是不好的,举个例子,如果外面的代码使用了synchronized(mSynchronizedPool)就会出现问题了,甚至有可能死锁。可以参考:Avoid synchronized(this) in Java?
如何使用
如何使用这几个类呢,方法如下:
public class MyPooledClass {
private static final SynchronizedPool sPool = new SynchronizedPool(10);
public static MyPooledClass obtain() {
MyPooledClass instance = sPool.acquire();
return (instance != null) ? instance : new MyPooledClass();
}
public void recycle() {
// Clear state if needed.
sPool.release(this);
}
// ...
}
非常简洁,看来实现一个Pool也是一件很容易的事情。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。