大体逻辑
发送网络请求用的是volley,然后多加了一个cache这是个适配器接口推荐是LruCache,先到cache中去找,找不到在添加进volley中到网络中区请求,如果找到了那么就直接就执行图片的添加逻辑,这个逻辑直接就执行了,没有作转到主线程的操作,所一个要求get()函数必须要在主线程调用。如果没在cache中找到就添加进volley,如果这时候已经有相同的请求在队列中了那么就讲请求添加到等待队列中,等请求返回了,就会检查请求队列中有没有可以再cache中找到请求的元素,处理这些请求。
private void batchResponse(String cacheKey, BatchedImageRequest request) {
mBatchedResponses.put(cacheKey, request);
// If we don't already have a batch delivery runnable in flight, make a new one.
// Note that this will be used to deliver responses to all callers in mBatchedResponses.
if (mRunnable == null) {
mRunnable = new Runnable() {
@Override
public void run() {
for (BatchedImageRequest bir : mBatchedResponses.values()) {
for (ImageContainer container : bir.mContainers) {
// If one of the callers in the batched request canceled the request
// after the response was received but before it was delivered,
// skip them.
if (container.mListener == null) {
continue;
}
if (bir.getError() == null) {
container.mBitmap = bir.mResponseBitmap;
container.mListener.onResponse(container, false);
} else {
container.mListener.onErrorResponse(bir.getError());
}
}
}
mBatchedResponses.clear();
mRunnable = null;
}
};
// Post the runnable.
mHandler.postDelayed(mRunnable, mBatchResponseDelayMs);
}
}
这里比较怪,他是现将待处理的请求从一个inFlight队列中取出来后,放进了 mBatchedResponses队列中,然后再从 mBatchedResponses队列中取出所有的request处理,然而mHandler.postDelayed(mRunnable, mBatchResponseDelayMs);在post Runnable的时候是有等待的,而且 mRunnable = null;在处理完post的任务后mRunnable是被赋值为null的,这就相当于每等待mBatchResponseDelayMs之后将所有收到的request集中发送出去处理。但是在mBatchedResponses队列用的是hashmap这个不支持线程同步,可能出现在执行mRunnable内容的时候队列中新加入了内容,这些内容不会被处理到,然后处理完之后 mBatchedResponses.clear();新加的内容就被清除了。