取消基于进度的图像请求Android - 图像加载器Volley,Picasso

时间:2014-11-26 10:34:35

标签: android android-volley universal-image-loader picasso image-load

Github中有许多流行的Image loader可用于图像加载和缓存以及管理图像请求。

  1. Universal Image Loader
  2. Volley
  3. Picasso
  4. Fresco(添加enhancement
  5. 我遇到了如果 Imageview 如果不再附加到窗口请求(批次和航班)将被取消的要求。

    然而, Listview Gridview Imageview 之类的滚动窗口小部件经常被附加到窗口并从窗口分离,因此队列中的请求分别被取消

    我担心的是他们没有机制来跟踪上面所有库中图像请求的进度。如果 Imageview 被分离,请求应该根据进度被取消,如果字节流有已完成75%的工作然后不应该取消,这反过来会减少网络带宽并减少网络呼叫,因为通常用户总是在滚动窗口小部件中滚动很多,如 Listview Gridview 等..

    以下是我对Volley的理解:

    public boolean removeContainerAndCancelIfNecessary(ImageContainer container) {
    
        /* logic to check progress of Request */
        mContainers.remove(container);
        if (mContainers.size() == 0) {
    
            mRequest.cancel();
            return true;
        }
        return false;
    }
    

    以下是我对毕加索的理解:

    private void cancelExistingRequest(Object target) {
    
        checkMain();
        Action action = targetToAction.remove(target);
        if (action != null) {
    
            action.cancel();
            dispatcher.dispatchCancel(action);
        }
        if (target instanceof ImageView) {
    
            ImageView targetImageView = (ImageView) target;
            DeferredRequestCreator deferredRequestCreator = targetToDeferredRequestCreator.remove(targetImageView);
            if (deferredRequestCreator != null) {
    
                deferredRequestCreator.cancel();
            }
        }
    }
    

    以下是我对Universal Image Loader的理解: 我没想到通用图像加载器允许取消内联请求。

    void cancelDisplayTaskFor(ImageAware imageAware) {
    
        cacheKeysForImageAwares.remove(imageAware.getId());
    } 
    

    请告诉我仅针对网络请求解决此问题的可能性。如果图像已经缓存,那么我们将取消该请求。

    电池性能在Android中非常重要

1 个答案:

答案 0 :(得分:2)

我不能说Volley和毕加索,但我可以说UIL是如何运作的。

UIL在任务处理期间不断检查ImageView。如果任务变为非实际(ImageView被回收(重用)或由GC收集),则UIL将停止此ImageView的任务。

如果在下载图像时任务变为非实际情况怎么样?如果下载的图像数据少于75%,UIL将中止下载。如果超过75% - 则UIL完成下载(即UIL在磁盘缓存中缓存图像文件),然后取消任务。