通用图像加载器:我可以使用缓存但同时刷新它吗?

8
我正在加载动态生成的图片,所以我希望它们始终是最新的。但是它们需要时间来加载,因此在更新的图片未出现时,我也希望显示缓存版本。
如何使用 Universal Image Loader 实现这一点?
更具体地说,当我调用“displayImage”时,我想实现以下功能:
1. 如果存在缓存图像,则立即显示它。 2. 无论如何从给定的URL开始下载。 3. 当图像加载完成后,在视图中显示它并替换缓存图像。 4. 更新缓存。
3个回答

26

最后我使用了一个ImageLoadingListener如下:

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

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

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会自己处理缓存,我是对的吗? - Bagusflyer
据我所知,您无法显式地使其刷新缓存。 我不确定它是否在一定时间后刷新缓存,但我认为不会。 - Victor Basso
在使用compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'时,请使用DiskCacheUtils而不是DiscCacheUtils。 - Mayura Devani

1
你可以使用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实际上就是缓存的吗? - Victor Basso

0
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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接