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

How can i delete one file from cache of ImageLoader (including different resolutions)

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

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());

但没用

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

我终于找到了解决办法: 我为本地文件使用了错误的 url,我忘记在代码中添加 file://,导致我的图像 url 被保存为 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);
}

在activity

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 因为它可以加载一段时间的图片,并且淡出动画有固定的时间段,如果我不这样做 - 裁剪层可能有一点时间已经消失并且裁剪后的图像仍然存在没有加载,这个不好