【Android】【内存优化】【减少对象创建】Android SDK对象池:Pool

接口

接口的位置: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);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_23049111/article/details/126348908