Picasso图片框架加载图片 使用及缓存问题

举报
再见孙悟空_ 发表于 2022/01/12 23:10:13 2022/01/12
【摘要】 项目中用的Picasso 框架 ,加载图片。使用很方便 而且缓存机制非常强大。 正常使用我们可以这样直接调用,我把方法写到一个util里面了。 调用代码如下: PicassoUtil.displayImage(context, Constants.U_IMG_URL, R.drawable.default, iv_ic...

项目中用的Picasso 框架 ,加载图片。使用很方便 而且缓存机制非常强大。

正常使用我们可以这样直接调用,我把方法写到一个util里面了。

调用代码如下:

PicassoUtil.displayImage(context, Constants.U_IMG_URL, R.drawable.default, iv_icon);
 

Util工具类


  
  1. import java.io.File;
  2. import android.content.Context;
  3. import android.text.TextUtils;
  4. import android.widget.ImageView;
  5. import com.squareup.picasso.Picasso;
  6. import com.squareup.picasso.RequestCreator;
  7. public class PicassoUtil {
  8. public static void displayImage(Context context, String url,
  9. int defaultDrawableId, ImageView userPhoto) {
  10. if (TextUtils.isEmpty(url)) {
  11. userPhoto.setImageResource(defaultDrawableId);
  12. } else if (url.startsWith("http")) {
  13. getPicasso(context, url, defaultDrawableId).into(userPhoto);
  14. } else if (url.startsWith("/")) {
  15. File file = new File(url);
  16. showUserPhoto(context, file, defaultDrawableId, userPhoto);
  17. }
  18. }
  19. public static RequestCreator getPicasso(Context context, String url,
  20. int loadingResId) {
  21. RequestCreator requestCreator = Picasso.with(context).load(url);
  22. if (loadingResId > 0) {
  23. return requestCreator.error(loadingResId).placeholder(loadingResId);
  24. } else {
  25. return requestCreator;
  26. }
  27. }
  28. private static void showUserPhoto(Context context, File file,
  29. int defaultDrawableId, ImageView imageView) {
  30. if (file == null || !file.exists()) {
  31. imageView.setImageResource(defaultDrawableId);
  32. return;
  33. }
  34. Picasso.with(context).load(file).error(defaultDrawableId)
  35. .placeholder(defaultDrawableId)
  36. .into(imageView);
  37. }
  38. }

上面的是正常加载图片的过程 ,都没有问题。 但是一些特殊情况 ,就不能用上述调用加载图片的方法了。因为会出问题,原因就是缓存机制。

当我们做修改头像功能时候  就会发现这个问题,当我们头像上传成功,服务器返回给我们修改成功的imgUrl时,我们拿着这个新的url去加载图片时候,发现用picasso上面的加载方法,图片并没有变化。

这是因为picasso有双缓存机制,就是 内存缓存 和 网络缓存 ,导致就算你给他传新的url,它也不会去重新访问新的地址上的图片。

怎么解决 让它不加载缓存中的图片呢?

在之前的版本中 用的是


  
  1. Picasso.with(context).load(url)
  2. .skipMemoryCache()
  3. .into(imageView);


若不起作用可改为:


  
  1. Picasso.with(context).load(url)
  2. .memoryPolicy(MemoryPolicy.NO_CACHE)
  3. .networkPolicy(NetworkPolicy.NO_CACHE)
  4. .error(R.drawable.default_icon)
  5. .into(imageView);

我用的上面的方法,可以成功。可以实现每次重新请求的效果。 先写这些,希望可以帮助大家。

有问题,大家可以加入我的qq群:Android开发经验交流群 454430053

文章来源: wukong.blog.csdn.net,作者:再见孙悟空_,版权归原作者所有,如需转载,请联系作者。

原文链接:wukong.blog.csdn.net/article/details/52251061

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。