android 对象池

android.support.v4.util 包下,有个类 Pools.java ,它是用来干什么的呢?我们看下这个类的功能描述:

Helper class for creating pools of objects.

超级简单的一个介绍,就是一个创建对象池的帮助类。

接下来我们去看下这个类的具体实现代码:

public final class Pools {

    // 管理对象池的接口
    public static interface Pool<T> {

        // 如果对象池中有这样的实例就返回这样的实例否则返回null
        public T acquire();

        // 释放一个实例到对象池
        public boolean release(T instance);
    }

    private Pools() {
        /* 私有化构造函数 */
    }

    /**
     * 简单的对象池
     *
     * @param <T> 对象池里保存的对象类型
     */
    public static class SimplePool<T> implements Pool<T> {
        private final Object[] mPool;

        private int mPoolSize;

        /**
         * 创建一个新实例
         *
         * @param maxPoolSize 对象池的最大容量
         *
         * @throws IllegalArgumentException 如果对象池的容量小于0
         */
        public SimplePool(int maxPoolSize) {
            if (maxPoolSize <= 0) {
                throw new IllegalArgumentException("The max pool size must be > 0");
            }
            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(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(T instance) {
            for (int i = 0; i < mPoolSize; i++) {
                if (mPool[i] == instance) {
                    return true;
                }
            }
            return false;
        }
    }

    /**
     * 同步的对象池
     *
     * @param <T> 对象池的类型
     */
    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(T element) {
            synchronized (mLock) {
                return super.release(element);
            }
        }
    }
}

其实从代码的实现来看是非常简单的,不过知道这个工具包的帮助类,可以为我们以后使用对象池提供更加方便的实现。接下来,我们看一下关于对象池的简单使用方法:

 public class MyPooledClass {

     private static final SynchronizedPool<MyPooledClass> sPool = 
             new SynchronizedPool<MyPooledClass>(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);
     }

     . . .
 }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,964评论 25 709
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,391评论 11 349
  • 官网: 开放平台:http://dev.renren.com/
    HiSea阅读 139评论 0 0
  • 1.remarkable=extraordinary=exceptional 非凡的 2. physical pr...
    珺_7cbb阅读 347评论 0 0
  • 表层习惯:午睡,早起,阅读 训练结果;中,差,差,训练不达标 强化信念:问题解决核心 我的情绪;自责 原因分析;1...
    傲娇的岛阳君阅读 80评论 0 0