如何从ImageLoader的缓存中删除一个文件(包括不同的分辨率)

时间:2016-04-19 11:18:27

标签: android caching universal-image-loader

我有图像文件://...qgKEIJC5EHey5qLUEDPWazJ9QimqkeQK.j​​pg,它加载了选项

new DisplayImageOptions.Builder()
                .showImageForEmptyUri(R.drawable.ic_empty)
                .showImageOnFail(R.drawable.ic_empty)
                .resetViewBeforeLoading(true)
                .cacheInMemory(true)
                .cacheOnDisk(false)
                .imageScaleType(ImageScaleType.EXACTLY)
                .bitmapConfig(Bitmap.Config.RGB_565)
                .build()

但是当我删除此文件时,将其从缓存中删除

    if (file.exists()) {
        file.setWritable(true);
        MemoryCacheUtils.removeFromCache(file.getAbsolutePath(), ImageLoader.getInstance().getMemoryCache());
        DiskCacheUtils.removeFromCache(file.getAbsolutePath(), ImageLoader.getInstance().getDiskCache());
        boolean deleted = file.delete();
        if (!deleted)
            Log.d("ERROR", "");
    }

图像加载程序仍然从内存缓存加载

D/ImageLoader: Display image in ImageAware (loaded from MEMORY_CACHE) [file://.../qgKEIJC5EHey5qLUEDPWazJ9QimqkeQK.jpg_430x430]

然后我尝试使用图片视图大小

删除此类文件
int size = getImageView().getWidth();
            String cachedFile = file.getAbsolutePath() + "_" + size + "x" + size; // = file://.../qgKEIJC5EHey5qLUEDPWazJ9QimqkeQK.jpg_430x430
            MemoryCacheUtils.removeFromCache(cachedFile, ImageLoader.getInstance().getMemoryCache());

但是没有用

如何从缓存中删除所有此类文件?

1 个答案:

答案 0 :(得分:0)

最后我找到了一个解决方案: 我在本地文件中使用了错误的网址,我忘记在代码中添加file://,因为我的图片网址已保存为file.getAbsolutePath()且未包含file://。另外我发现如何用裁剪顺利替换原始图片(在裁剪图层覆盖原始图片然后需要消失并显示已经裁剪的图像的情况下)

适配器中的

public void setImageLoader(final ImageView imageView, final MyImage myImage) {
        final String path = "file://" + myImage.getAbsPathImage();
        final DisplayImageOptions options = new DisplayImageOptions.Builder()
                .showImageForEmptyUri(R.drawable.ic_empty)
                .showImageOnFail(R.drawable.ic_empty)
                .resetViewBeforeLoading(false) //important!
                .cacheInMemory(true) //important!
                .cacheOnDisk(true) //important!
                .imageScaleType(ImageScaleType.EXACTLY)
                .bitmapConfig(Bitmap.Config.RGB_565)
                .build();
        if (!myImage.isImageCropCacheUpdated()) {
            List<String> memCache = MemoryCacheUtils.findCacheKeysForImageUri(path, ImageLoader.getInstance().getMemoryCache());
            boolean cacheFound = !memCache.isEmpty();
            if (!cacheFound) {
                File discCache = DiskCacheUtils.findInCache(path, ImageLoader.getInstance().getDiskCache());
                if (discCache != null) {
                    cacheFound = discCache.exists();
                }
            }
            if (cacheFound) {
                myImage.setIsImageCropCacheUpdated(true);
                MemoryCacheUtils.removeFromCache(path, ImageLoader.getInstance().getMemoryCache());
                DiskCacheUtils.removeFromCache(path, ImageLoader.getInstance().getDiskCache());
            }
        }

        ImageLoader.getInstance().displayImage(path, imageView, options);
}

活动

final ImageView imageView = (ImageView) pager.findViewWithTag(Constants.TAGS.IMAGEVIEW_TAG
                        + pager.getCurrentItem()); //get image view from view pager
                imageView.setImageBitmap(getCropImageView().getCroppedImage());
                imagePagerAdapter.setImageLoader(imageView, getCurrentImage()); //get cropped image from special crop image view and call setImageLoader from adapter

我没有使用notifyDataSetChanged(),因为在这种情况下图像闪烁(不知道为什么),之后我调用淡出特殊裁剪图像视图的动画,它看起来很棒,我也将裁剪后的图像设置为imageView在图像加载器之前,因为它可以加载图片一段时间,而淡出动画有一个固定的时间段,如果我不这样做 - 可能有一点时间裁剪图层已经消失而裁剪的图像仍然没有加载,这不好