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