Fresco如何通过编程方式将Bitmap添加到缓存中

9
我正在将图片上传到服务器,一旦上传完成,服务器会返回新的URI(可以与旧的URL相同)。我想删除旧的缓存图片,并为新的URI插入新的图片。
我尝试通过以下方式实现:
// Retrofit2 onResponse

String newImageUri = response.body().getUri();
String oldImageUri = Preferences.getUser().getImageUrl();   

// Remove old image from cache
Fresco.getImagePipeline().evictFromCache(Uri.parse(oldImageUri));               
Fresco.getImagePipeline().evictFromDiskCache(Uri.parse(oldImageUri));
Fresco.getImagePipeline().evictFromMemoryCache(Uri.parse(oldImageUri));
Fresco.getImagePipelineFactory().getMainFileCache().remove(new SimpleCacheKey(oldImageUri));

// Insert new image at new URI
try {
    Fresco.getImagePipelineFactory().getMainFileCache().insert(new SimpleCacheKey(newImageUri), new WriterCallback() {
        @Override
        public void write(OutputStream os) throws IOException {
            os.write(imageData); // byte[] or the new Bitmap
        }
    });
}
catch (Exception e) {
    e.printStackTrace();
}
uriProfileImage.setImageURI(newImageUri);

我只看到旧图像,没有任何异常情况出现。

这个回答中,他们使用了.remove()方法从getImagePipelineFactory().[from_to_delete].remove(...)调用,而您正在使用的是evict方法。您可以尝试一下,看看是否有帮助(也许对您来说不起作用,因为该回答已经两年了,Fresco库可能在此期间进行了更改)。 - MatPag
@MatPag 我看到过那个答案,显然对我不起作用。 - Arbitur
你说你只看到了旧图像。你是如何测试的? - Tin Tran
2个回答

1

我解决了这个问题,原因是新的Uri格式出现错误...


1
另一个值得注意的地方:如果你在RecyclerView.ViewHolder中加载ImageView -> 你需要确保在OnBindViewHolder中调用的第一行是将imageview源设置为null。这可以确保图像不会从池中重复使用。 - apelsoczi

-1
 Uri uri = Uri.parse("http://frescolib.org/static/fresco-logo.png");
Fresco.getImagePipelineFactory().getMainDiskStorageCache().remove(new CacheKey(uri.toString()));
Fresco.getImagePipelineFactory().getSmallImageDiskStorageCache().remove(new CacheKey(uri.toString())); 

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