【问题标题】:Universal Image Loader: Can I use cache but also refresh it?通用图像加载器:我可以使用缓存但也可以刷新它吗?
【发布时间】:2013-10-03 22:53:07
【问题描述】:

我正在加载动态生成的图像,所以我总是希望它们是最新的。但是它们需要时间来加载,所以我也想在没有更新的时候显示一个缓存版本。 如何使用通用图像加载器做到这一点?

更具体地说,当我调用“displayImage”时,我希望它执行以下操作:

  1. 如果存在缓存图像,则立即显示它。
  2. 还是从给定的 url 开始下载。
  3. 图像加载完成后,将其显示在视图中,替换缓存的图像。
  4. 更新缓存。

【问题讨论】:

    标签: android caching universal-image-loader


    【解决方案1】:

    所以最后我使用了 ImageLoadingListener 如下:

    onLoadingStarted: 加载开始时检查缓存。

    onLoadingComplete: 如果没有找到缓存,则什么也不做。请求将被发送到网络,缓存将自然更新。 否则清除缓存并再次调用 displayImage(这次不需要监听器)。缓存的图像将正常显示在视图中。此外,当第二次加载完成时,视图和缓存将被更新。

    ImageLoader.getInstance().displayImage(imageUri, view, new SimpleImageLoadingListener() {
                boolean cacheFound;
    
                @Override
                public void onLoadingStarted(String url, View view) {
                    List<String> memCache = MemoryCacheUtils.findCacheKeysForImageUri(url, ImageLoader.getInstance().getMemoryCache());
                    cacheFound = !memCache.isEmpty();
                    if (!cacheFound) {
                        File discCache = DiscCacheUtils.findInCache(url, ImageLoader.getInstance().getDiscCache());
                        if (discCache != null) {
                            cacheFound = discCache.exists();
                        }
                    }
                }
    
                @Override
                public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                    if (cacheFound) {
                        MemoryCacheUtils.removeFromCache(imageUri, ImageLoader.getInstance().getMemoryCache());
                        DiscCacheUtils.removeFromCache(imageUri, ImageLoader.getInstance().getDiscCache());    
                        ImageLoader.getInstance().displayImage(imageUri, (ImageView) view);
                    }
                }
            });
        }
    

    【讨论】:

    • 我认为 ImageLoader 会自己处理缓存。我说的对吗?
    • afaik 你不能明确地让它刷新缓存。我不确定它是否会在一段时间后刷新缓存,但我想不会
    • 在编译 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' 的情况下使用 DiskCacheUtils 而不是 DiscCacheUtils
    【解决方案2】:

    您可以使用 ImageLoadingListener。该接口有 4 个方法可以覆盖: onLoadingStarted、onLoadingFailed、onLoadingComplete、onLoadingCancelled。在 onLoadingStarted 中,您可以将图像设置为缓存的图像,然后在完成时更改它。

    所以调用看起来像这样:

    imgLoader.displayImage(url, myImageView,new ImageLoadingListener() 
    {
    
            @Override
            public void onLoadingStarted(String arg0, View arg1) {
                //Display cached image if it exists
    
            }
    
            @Override
            public void onLoadingFailed(String arg0, View arg1, FailReason arg2) {
                // TODO Auto-generated method stub
    
            }
    
            @Override
            public void onLoadingComplete(String arg0, View arg1, Bitmap arg2)
            {
    
                ((ImageView)arg1).setBitmapImage(arg2);
            }
    
            @Override
            public void onLoadingCancelled(String arg0, View arg1) {
                // TODO Auto-generated method stub
    
            }
    });
    

    【讨论】:

    • 如果缓存命中,它不会从网络请求图像吗?所以我在 onLoadingComplete 中收到的 Bitmap 实际上是缓存的?
    【解决方案3】:
    private lateinit var options: DisplayImageOptions
    
    options = DisplayImageOptions.Builder()
    
                    .considerExifParams(true)
                    .bitmapConfig(Bitmap.Config.RGB_565)
                    .cacheOnDisk(true)
                    .cacheInMemory(true)
                    .build()   
    
    ImageLoader.getInstance().displayImage(Model.img_url, itemView.ivPlayer, options)
    

    【讨论】:

      猜你喜欢
      • 2015-06-20
      • 1970-01-01
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-02
      • 1970-01-01
      相关资源
      最近更新 更多