接口
接口的位置:androidx.core.util
定义如下:
public interface Pool<T> {
@Nullable
T acquire();
boolean release(@NonNull T instance);
}
Google对这个类的描述是:
用于创建对象池的辅助类
移动设备的内存是稀缺资源,频繁的创建对象必然导致频繁的垃圾回收,触发STW(Stop-The-World)。对于频繁创建的对象,使用对象池,可以避免频繁的分配内存。类似的例子是Handler机制中Message的对象池。
接口定义了两个方法,分别是获取对象和释放对象。
子类SimplePool
SimplePool,内部使用数组缓存对象,在对象池创建时,指定缓存数据的数量,即数组的大小。这个类不是线程安全的。
public static class SimplePool<T> implements Pool<T> {
private final Object[] mPool;
private int mPoolSize;
public SimplePool(int maxPoolSize) {
mPool = new Object[maxPoolSize];
}
@Override
@SuppressWarnings("unchecked")
public T acquire() {
if (mPoolSize > 0) {
final int lastPooledIndex = mPoolSize - 1;
T instance = (T) mPool[lastPooledIndex];
mPool[lastPooledIndex] = null;
mPoolSize--;
return instance;
}
return null;
}
@Override
public boolean release(@NonNull T instance) {
if (isInPool(instance)) {
throw new IllegalStateException("Already in the pool!");
}
if (mPoolSize < mPool.length) {
mPool[mPoolSize] = instance;
mPoolSize++;
return true;
}
return false;
}
private boolean isInPool(@NonNull T instance) {
for (int i = 0; i < mPoolSize; i++) {
if (mPool[i] == instance) {
return true;
}
}
return false;
}
}
子类SynchronizedPool
继承自SimplePool,区别在于这个类是线程安全的,内部使用Object对象锁。
public static class SynchronizedPool<T> extends SimplePool<T> {
private final Object mLock = new Object();
public SynchronizedPool(int maxPoolSize) {
super(maxPoolSize);
}
@Override
public T acquire() {
synchronized (mLock) {
return super.acquire();
}
}
@Override
public boolean release(@NonNull T element) {
synchronized (mLock) {
return super.release(element);
}
}
}