从pinchImageView学习对象池

来源:互联网 发布:如何用vb编写上位机 编辑:程序博客网 时间:2024/05/21 22:29

pinchImageView是一个能够实现完美图片手势操作的框架,包括,捏合手势放大缩小,双击放大缩小,大图边界和小图回弹效果。里面为了防止发生抖动,采用了对象池的方式,感觉挺有意思,记录分析一下。
项目源码地址:https://github.com/boycy815/PinchImageView

对象池父类

private static abstract class ObjectsPool<T> {        private int mSize;        private Queue<T> mQueue;        public ObjectsPool(int size) {            mSize = size;            mQueue = new LinkedList<T>();        }        public T take() {            if (mQueue.size() == 0) {                return newInstance();            } else {                return resetInstance(mQueue.poll());            }        }        public void given(T obj) {            if (obj != null && mQueue.size() < mSize) {                mQueue.offer(obj);            }        }        abstract protected T newInstance();        abstract protected T resetInstance(T obj);    }

这个类比较简单,相当于一个小缓存,把对象扔到池里面,take()时,不存在创建,存在清空;given时释放内存。实际上对象池的关键在于:创建时并不会把对象放入对象池中,释放的时候才会!看一下子类的代码:

private static class MatrixPool extends ObjectsPool<Matrix> {        public MatrixPool(int size) {            super(size);        }        @Override        protected Matrix newInstance() {            return new Matrix();        }        @Override        protected Matrix resetInstance(Matrix obj) {            obj.reset();            return obj;        }    }

可以看到newInstance()中,只是创建了对象,当given(obj)的时候,队列调用:mQueue.offer(obj);进行对象添加,但是取出的时候又重新设置了。和懒汉,恶汉的单例模式相比,这种方式的好处是可以运行一定程度的异步程序,不会因为多线程问题造成多对象的内存开销。对象回收利用很好的解决了这个问题,并发造成的数据暴增能够得到一定的缓解。但是比较麻烦的地方在于一定要把握好given()的时机,没有given(),则对象池无效。given()的操作造成了此方法的使用效果降低。目前的设想是把它用于dialog,因为dialog往往会经常new,而同一界面同时弹出的dialog数量不会超过10个,对此弹框可能会造成内存压力。

原创粉丝点击