Picasso使用问题记录 - 加载local camera image 失败

目录

Picasso github地址:https://github.com/square/picasso

问题及解决尝试

问题1:
使用了 Picasso的最新版本 2.5.2。
手机是魅族魅蓝note2
在加载本地手机拍照(DCIM/Camera文件夹下)和截图的图片时失败。

原因是在加载图片时使用了 resize()

尝试解决方案和效果:
1、去掉resize(而且需要在加载大图的Activity配置中添加 process:picture属性)
效果:可以加载本地Camera 图片,但内存占用很高

参考以下文章的:4 新进程中查看大图
http://blog.csdn.net/ashqal/article/details/48005833

2、将本地拍照图片取出,用工具进行压缩处理(但压缩后大小只是略小于原图),并放回同一个文件夹
效果:可以正常显示压缩后的图片。猜测:应该不是图片大小的问题。

3、最终处理:
回退Picasso的版本,不使用 2.5.2,改为使用 2.4.0
compile ‘com.squareup.picasso:picasso:2.4.0’

效果:resize可使用,图片能正常显示
【似乎2.5.2的问题会在2.6.0解决】

返回目录

问题2

通过picasso加载网络图片时,例如在聊天界面,页面刷新时,图片经常会明显重加载。实际上是图片加载没能从缓存中提取,而再次从网络获取导致。

原因分析:由于业务需求,加载的网络图片链接有时效性,因为同一张图片资源在不同时间段的服务器路径是变化的。因此Picasso的缓存机制无法根据上一次的key来找到该图片的缓存,因而又再次请求服务器,造成时间差形成“闪动”。

picasso源码在图片缓存key的处理如下:

static String createKey(Request data, StringBuilder builder) {
    if (data.stableKey != null) {
      builder.ensureCapacity(data.stableKey.length() + KEY_PADDING);
      builder.append(data.stableKey);
    } else if (data.uri != null) {
      String path = data.uri.toString();
      builder.ensureCapacity(path.length() + KEY_PADDING);
      builder.append(path);
    } else {
      builder.ensureCapacity(KEY_PADDING);
      builder.append(data.resourceId);
    }
    builder.append(KEY_SEPARATOR);
    ...
 }

 源码对(Request.java) stableKey的解释: 
 Optional stable key for this request to be used instead of the URI or resource ID when caching. Two requests with the same value are considered to be for the same resource.

如上:
在创建图片缓存 key时,显示判断 stablekey 是否存在,存在则使用 stablekey,
不存在则接着判断图片的uri是否存在,存在则使用
所以,对于网络图片,如果不设置 stablekey,那么picasso内部则会以图片的uri作为cache查找缓存的图片的 key。而如果 uri是变化的,那么自然就无法在cache中找到相应的图片缓存。

解决:
实际上Picasso开放了接口给使用者配置 stablekey。因此在加载网络图片的时候,如果我们将stablekey 设置为跟图片相关而又不变化的参数就可以使Picasso能在cache中找到相应的缓存,如 将stablekey设置为图片的名称(一般不随时间变化,且不重复)
如:

Picasso.with(this.applicationContext)
       .load(new File(uri))
       .error(...)
       .placeholder(...)
       .stableKey(imageName)
       ...

相关Picasso的GitHub issues

1、Exception: java.io.IOException: Cannot reset #364 https://github.com/square/picasso/issues/364

2、https://github.com/square/picasso/issues?utf8=%E2%9C%93&q=camera

返回目录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值