Pool, SimplePool与SynchronizedPool
因为硬件资源的限制,Android在很多地方都使用了Pool的,特别是对于需要通过native的方式调用资源,比如专门用于获取Touch、Flinging以及其他手势速度的VelocityTracker类,文档中指明了调用方式必须是:
//创建VelocityTrackermVelocityTracker=VelocityTracker.obtain();//回收mVelocityTracker.recycle();mVelocityTracker=null;
其内部使用了SynchronizedPool来实现:
publicfinalclassVelocityTracker{privatestaticfinalSynchronizedPool<VelocityTracker>sPool=newSynchronizedPool<VelocityTracker>(2);//省略其他代码}
其实现包括三个类和接口:Pool接口, SimplePool类与SynchronizedPool类,其实现代码在android.util.Pools类中。代码结构如下:
Pool接口
publicstaticinterfacePool<T>{publicTacquire();publicbooleanrelease(Tinstance);}
定义了两个方法,一个从Pool中获取,另一个将对象释放到Pool中,非常简洁。
SimplePool类
publicstaticclassSimplePool<T>implementsPool<T>{privatefinalObject[]mPool;privateintmPoolSize;publicSimplePool(intmaxPoolSize){if(maxPoolSize<=0){thrownewIllegalArgumentException("Themaxpoolsizemustbe>0");}mPool=newObject[maxPoolSize];}//...}
使用一个Object数组来存放,因此Pool的容量是固定的,因此这里用Object数组是最简单的,如果需要实现可以自动扩展的Pool,大可以将Object数组替换成链表。
SynchronizedPool类
publicstaticclassSynchronizedPool<T>extendsSimplePool<T>{privatefinalObjectmLock=newObject();//...publicTacquire(){synchronized(mLock){returnsuper.acquire();}}publicbooleanrelease(Telement){synchronized(mLock){returnsuper.release(element);}}}
这里只是增加了一个锁(mLock),在Java里面任何一个对象都可以当作锁。至于为什么直接用synchronized(this),一般认为synchronized(this)这样是不好的,举个例子,如果外面的代码使用了synchronized(mSynchronizedPool)就会出现问题了,甚至有可能死锁。可以参考:Avoid synchronized(this) in Java?
如何使用
如何使用这几个类呢,方法如下:
publicclassMyPooledClass{privatestaticfinalSynchronizedPoolsPool=newSynchronizedPool(10);publicstaticMyPooledClassobtain(){MyPooledClassinstance=sPool.acquire();return(instance!=null)?instance:newMyPooledClass();}publicvoidrecycle(){//Clearstateifneeded.sPool.release(this);}//...}
非常简洁,看来实现一个Pool也是一件很容易的事情。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。