我有一个Android应用程序,其中包含个人资料图片。 用户可以编辑他/她的个人资料图像。 我正在使用Picasso来加载图像,但每次加载个人资料图像时,Picasso都会加载旧图像。
当我上传个人资料图片时,我不会更改它的网址,因此每个用户的个人资料图片网址都是不变的。
第一个问题:每次用户更改个人资料图片时,我应该更改个人资料图片网址吗?
第二个问题:当用户更改他/她的个人资料图片时,我使用此代码使Picasso无效以加载新图片:
picassoInstance.load(url)
.networkPolicy(NetworkPolicy.NO_CACHE)
.transform(new CircleTransform())
.placeholder(dr)
.into(imageView);
但毕加索告诉我旧的。 还有一件事: 我首先将图片网址加载到imageView而不调用networkPolicy方法。 我该如何处理这个问题?
答案 0 :(得分:1)
每张图片都有不同的名称,每当上传新图片时,您都必须更新图片网址
<强> EG。当前网址: https://photographylife.com/nikon-d810-high-resolution-image-samples
图片名称为: nikon-d810-high-resolution-image-samples
在上传新图片后,名称会有所不同例如:image-sample
因此您需要使用新名称更新该图片网址 https://photographylife.com/image-sample
试试这个,我告诉你因为我同样希望这会对你有帮助!
答案 1 :(得分:0)
让我们逐一讨论:
每次用户更改个人资料时,我都应该更改个人资料图片网址吗? 图像?
没有。您可能会想到其他方法。在我的情况下,我每次使用用户的特定名称更改网址时下载图片(因为我们正在考虑个人资料图片)。因此,当我用Picasso加载图像时,我传递了文件路径而不是URL,这样,每次都不会从URL中获取。毕加索实际上并没有做到这一点。它维护一个缓存。如果文件不存在,只需放置一个占位符。
当用户更改他/她的个人资料图片时,我无法加载Picasso 使用此代码的新图像:
我的代码中没有看到任何无效代码。我会参考此link来了解他们是如何解决缓存问题的。
我将图片网址加载到imageView而不调用networkPolicy方法 起初。
因此,如果您从外部存储中提取图像,我认为没有必要这样做。
另一个建议是在这些情况下使用Glide。这几乎和毕加索一样,但我个人喜欢用Glide代替毕加索。
希望有所帮助。
答案 2 :(得分:0)
使用Glide而不是Picasso,因为谷歌建议使用Glide http://inthecheesefactory.com/blog/get-to-know-glide-recommended-by-google/en
防止Glide中的缓存
Glide.with(DemoActivity.this)
.load(Uri.parse("file://" + imagePath))
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.into(mImage);
答案 3 :(得分:0)
将此类添加到com.squareup.picasso包中。
package com.squareup.picasso;
public class PicassoTools {
public static void clearCache (Picasso p) {
p.cache.clear();
}
}
因为缓存具有包可见性,所以此util类可以为您清除缓存。你只需要打电话:
PicassoTools.clearCache(Picasso.with(context));
答案 4 :(得分:0)
我发现问题所在: 我拒绝了磁盘缓存而不是内存缓存。我应该使用这段代码:
picassoInstance.load(url)
.networkPolicy(NetworkPolicy.NO_CACHE)
.memoryPolicy(MemoryPolicy.NO_CACHE)
.transform(new CircleTransform())
.placeholder(dr)
.into(imageView);
我使用此链接: picasso-influencing-image-caching
谢谢大家
答案 5 :(得分:0)
在加载之前,您需要使文件无效使用下面给出的代码:
Picasso.with(getActivity()).invalidate(file);
要了解更多详情,请从他们的网站上学习Picasso文档。