Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 通用图像加载器:我可以使用缓存,但也刷新它吗?_Android_Caching_Universal Image Loader - Fatal编程技术网

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

Android 通用图像加载器:我可以使用缓存,但也刷新它吗?,android,caching,universal-image-loader,Android,Caching,Universal Image Loader,我正在加载动态生成的图像,所以我总是希望它们是最新的。但是它们需要时间来加载,所以我还想在更新版本没有出现时显示缓存版本。 如何使用Universal Image Loader执行此操作 更具体地说,当我调用“displayImage”时,我希望它执行以下操作: 如果存在缓存图像,请立即显示它 无论如何,从给定的url开始下载 图像加载完成后,在替换缓存图像的视图中显示它 更新缓存 您可以使用ImageLoadingListener。此接口有4种要重写的方法: onLoadingStarted、

我正在加载动态生成的图像,所以我总是希望它们是最新的。但是它们需要时间来加载,所以我还想在更新版本没有出现时显示缓存版本。 如何使用Universal Image Loader执行此操作

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

  • 如果存在缓存图像,请立即显示它
  • 无论如何,从给定的url开始下载
  • 图像加载完成后,在替换缓存图像的视图中显示它
  • 更新缓存

  • 您可以使用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
    
            }
    });
    

    最后,我使用了ImageLoadingListener,如下所示:

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

    加载完成: 如果未找到缓存,则不执行任何操作。请求将被发送到网络,缓存将自然更新。 否则,清除缓存并再次调用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.getInstance().displayImage(imageUri,视图,新的SimpleImageLoadingListener()){
    发现布尔缓存;
    @凌驾
    公共void onLoadingStarted(字符串url,视图){
    List memCache=MemoryCacheUtils.findCacheKeysForImageUri(url,ImageLoader.getInstance().getMemoryCache());
    cacheFound=!memCache.isEmpty();
    如果(!cachefind){
    文件discCache=DiscCacheUtils.findInCache(url,ImageLoader.getInstance().getDiscCache());
    if(discCache!=null){
    cacheFound=discCache.exists();
    }
    }
    }
    @凌驾
    public void onLoadingComplete(字符串imageUri、视图视图、位图加载图像){
    如果(找到缓存){
    MemoryCacheLS.removeFromCache(imageUri,ImageLoader.getInstance().getMemoryCache());
    removeFromCache(imageUri,ImageLoader.getInstance().getDiscCache());
    ImageLoader.getInstance().displayImage(imageUri,(ImageView)视图);
    }
    }
    });
    }
    
    如果缓存命中,它不会从网络请求图像吗?因此,我在onLoadingComplete中收到的位图实际上是缓存的位图?我认为ImageLoader将自行处理缓存。我说的对吗?好吧,你不能明确地让它刷新缓存。我不确定它是否会在一段过期时间后刷新缓存,但在编译'com.nostra13.universalimageloader:universalimageloader:1.9.5'时,我想不会使用DiskCacheUtils而不是DiscCacheUtils
    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)