上一节我们讲了请求发出去的整个过程,在BasicNetwork中,我们发现了一个属性。
private static int DEFAULT_POOL_SIZE;
protected final ByteArrayPool mPool;
DEFAULT_POOL_SIZE = 4096;
这个ByteArrayPool是做什么的,看名字是一个字节数组的池子,就好像线程池、连接池一样,大概也明白了,就是用来复用的,具体的我们来看一看。
假如我们自己写一个Http请求,接收返回数据时,最直接最常见的就是new一个byte[],用来接收response的数据,一个两个请求还好,作为一个支持多并发请求的框架,如果每次都是new的话,这个开销太大,内存占用太多、碎片问题就会出现,所以Volley在这方面还是做了工作的,引入了ByteArrayPool,它内部有一个列表,在new一个byte[]前,先会到列表中查找,是否有可以容纳新byte[]的对象,如果有就取出来使用,如果没有,就new一个,并放入列表中,待用。下面我们看看具体实现。
/**最近使用的buffer的池子*/
private List<byte[]> mBuffersByLastUse = new LinkedList();
/**buffer大小的池子,从小到大排序*/
private List<byte[]> mBuffersBySize = new ArrayList(64);
/**当前使用了的空间大小*/
private int mCurrentSize = 0;
/**极限值*/
private final int mSizeLimit;
初始化