Volley ImageLoader

大体逻辑

发送网络请求用的是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();新加的内容就被清除了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值