以下是使用Java Pool(泛型池)为Android实例化TouchEvents的示例:
import java.util.ArrayList;
import java.util.List;
public class Pool<T> {
public interface PoolObjectFactory<T> {
public T createObject();
}
private final List<T> freeObjects;
private final PoolObjectFactory<T> factory;
private final int maxSize;
public Pool(PoolObjectFactory<T> factory, int maxSize) {
this.factory = factory;
this.maxSize = maxSize;
this.freeObjects = new ArrayList<T>(maxSize);
}
public T newObject() {
T object = null;
if (freeObjects.isEmpty()) {
object = factory.createObject();
} else {
object = freeObjects.remove(freeObjects.size() - 1);
}
return object;
}
public void free(T object) {
if (freeObjects.size() < maxSize) {
freeObjects.add(object);
}
}
}
但是,我真的不明白这段代码是如何运作的:
if (freeObjects.isEmpty()) {
object = factory.createObject();
} else {
object = freeObjects.remove(freeObjects.size() - 1);
}
让我们说:
touchEventPool = new Pool<TouchEvent>(factory, 100);
这是否意味着它将存储一个包含100个事件的数组(当#101进入内部时,将会排除#1,就像先进先出一样)?
我认为它应该保留一些最大数量的对象,然后处理额外的。我读过10次书的描述......但是无法得到它。也许有人解释这是如何运作的?
答案 0 :(得分:3)
我认为它应该保留一些最大数量的对象,然后处理额外的。我读了10次书的描述......但是无法得到它。也许有人解释这是如何运作的?
排序。该类在名为List
的{{1}}中保留预先创建的对象的缓存。当您要求新对象(通过pool
方法)时,它将首先检查newObject
以查看对象是否可供使用。如果池为空,则只创建一个对象并将其返回给您。如果有可用的对象,它将删除pool
中的最后一个元素并将其返回给您。
注释:
pool
当您将对象返回缓存时(通过if (freeObjects.isEmpty()) {
// The pool is empty, create a new object.
object = factory.createObject();
} else {
// The pool is non-empty, retrieve an object from the pool and return it.
object = freeObjects.remove(freeObjects.size() - 1);
}
方法),只有在未满足池的最大大小时才会将其放回池中。
注释:
free()
如果已达到池的最大大小,则不会存储您正在释放的对象,并且(可能)会进行垃圾回收。
答案 1 :(得分:1)
任何池的想法都在于创建受控环境,其中(通常)当可以从池中重用一些未使用的空闲实例时,不需要创建新的(事件)实例。
创建时
touchEventPool = new Pool<TouchEvent>(factory, 100);
你希望100个实例在程序的任何特定时刻都足够了。
因此,当您想要获得第101个事件时,该过程可能会释放前5个,20个甚至99个事件,并且池将能够重用其中任何一个。
如果没有空闲实例,那么根据池策略,将创建新策略,或者请求者线程将等待其他线程释放一个并返回池。在这个特定的实现中,将创建一个新的。
答案 2 :(得分:1)
我认为对象池的主要概念是减少对象实例的频率。
这是否意味着它将存储一个包含100个事件的数组(当#101进入内部时,会像先进先出一样处理#1)?这是否意味着它将存储一个数组100个事件(当#101进入内部时,会像先进先出一样处理#1)?
我不这么认为。最大数量100表示freeObjects,但是当前正在使用对象。当一个物体不再使用时,你应该释放它。然后释放的对象将不会被描述,而是作为freeObject存储(max num表示这些备用对象的对象)。下次需要另一个新对象时,您不必实例化新对象。所需要的只是重用一个备用的freeObjects。
因此,您可以避免昂贵的对象实例化。它可以提高性能。