8

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

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

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

3 回答 3

26

所以最后我使用了一个 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);
                }
            }
        });
    }
于 2013-10-15T16:18:27.370 回答
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

        }
});
于 2013-09-27T16:10:02.587 回答
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)
于 2018-12-26T09:32:53.443 回答