在毕加索中应用变换时不重用原始图像的缓存

时间:2019-06-03 14:12:06

标签: android picasso image-caching

我正在尝试使用毕加索在原始位图和转换后的位图之间切换。 问题是第一次加载原始图像似乎已被缓存,但是当我加载转换后的图像时,它似乎又重新加载了图像而不使用缓存。使用相同的URL来获取图像。仅在原始和转换后才第一次发生,然后才使用缓存。

我期望Picasso应该自动重用兑现的原始图像以应用转换并立即加载它。也许我缺少了一些东西。

这是图像加载的代码。

 private fun loadOriginalImage(i: Product, productImage: ImageView) {
    Picasso.get().load(getProductUrl(i.id)).placeholder(R.color.light_grey)
        .error(R.color.light_grey).fit().centerCrop().into(productImage)
}


 private fun loadGreyedImage(i: Product, productImage: ImageView) {
    Picasso.get().load(getProductUrl(i.id)).placeholder(R.color.light_grey)
        .error(R.color.light_grey).fit().centerCrop().transform(GrayScaleTransform()).into(productImage)
}

毕加索版本implementation 'com.squareup.picasso:picasso:2.71828'

2 个答案:

答案 0 :(得分:1)

是内存缓存还是磁盘缓存? 您如何验证确实没有使用缓存?

这里有一些选项(考虑到MemoryPolicy和NetworkPolicy未被修改,并且您没有替换标准的okHTTP3客户端):

  • 这两次调用之间图像被从内存缓存中推出(缓存太小,使调用无效等)
  • 磁盘缓存受HTTP客户端控制,与Picasso无关,因此HTTP标头设置不当可能会导致这种情况(但在这种情况下,原始图像应已从内存缓存中删除)

打开指示器和记录可以提供有关发生情况的更多信息:

Picasso  
.with(context)
.setIndicatorsEnabled(true)
.setLoggingEnabled(true)

此外,如果有可能仅执行这两个调用,则可以执行它们并从内存缓存中获取快照数据,以检查其大小,命中和未命中等。

StatsSnapshot stats = Picasso.with(context).getSnapshot();  
Log.d("stats", stats.toString());  

这可能会提供更多调试信息以供考虑,例如是否确实有两个缓存调用,是否未命中等

编辑:key()函数是否在您的转换中正确实现了?

答案 1 :(得分:1)

启用日志后,我验证了原始图像确实已被缓存,并且@Sputnik表示该问题似乎是由于从原始图像缓存创建转换后的位图的延迟引起的。

但是预缓存转换图像的解决方案不是最好的一种。首先,有很多图像,只有当用户在回收站中单击图像时才需要灰度图像。可能永远不会发生,但是我们已经缓存了两倍大小的图像,以防万一。

因此,在与毕加索一起玩并记录后,对我有用的解决方案是将原始图像用作占位符。

所以而不是

    Picasso.get().load(getProductUrl(i.id)).placeholder(R.color.light_grey)
    .error(R.color.light_grey).fit().centerCrop().transform(GrayScaleTransform()).into(productImage)

我做到了

    Picasso.get().load(getProductUrl(i.id)).placeholder(productImage.drawable)
    .error(R.color.light_grey).fit().centerCrop().transform(GrayScaleTransform()).into(productImage)

这样,我的占位符就是原始图像,它使过渡平滑,并通过缓存所有转换后的图像消除了潜在的开销。