Picasso Image再次为具有不同尺寸的ImageView下载?

我正在我的应用程序中使用Picasso来有效地加载图像并且正在最好地完成他的工作。问题是,目前如果我用相同的URL多​​次调用Picasso.with() ,但每次使用不同的图像视图尺寸,图像再次下载。在Glide我们有方法.diskCacheStrategy()DiskCacheStrategy.SOURCE解决问题。在毕加索有任何替代方式吗?

在这个查询中我们将得到Glid的解决方案,但不是Picasso.how我可以重用图像而不需要重新加载不同尺寸的ImageView。

这是我正在使用的代码

 Picasso.with(context) .load(URI) .placeholder(R.drawable.ic_profile_thumb) .resize(180, 180).centerInside() .into(viewHolder.imgThumbnail); 

Picasso不会将图像缓存到磁盘,Picasso只有一个内存缓存。 磁盘缓存由网络库(OKhttp)完成。 因此写入磁盘缓存的映像永远不会重新resize。

如果多次下载相同的url图像,则可能需要检查网络库。

如果您的项目使用okhttp库,那么picasso会自动将其用作默认下载程序。 如果您正在使用任何其他网络库,则必须编写自己的下载程序并使用它进行设置

 Picasso.Builder(context).downloader(customDownloader) 

这个链接可能会让事情变得清晰

毕加索默认不会调整图像大小。 如果你像下一个那样做一个简单的电话……

 Picasso.with(context).load("https://goo.gl/v9EkbF").into(imageView); 

…毕加索正在缓存全尺寸图像。 从那时起,每次调用相同的URL时,Picasso都会重用该全尺寸图像,让GPU在视图中resize。

使用resize()方法只缓存已resize的图像,如果使用不同的大小,Picasso将需要再次下载图像。

不要使用resize()选项,您将获得更好的带宽使用,但要小心内存使用情况。

毕加索的默认值

毕加索确实有自动内存和磁盘缓存。 最近请求的任何图像都将在内存缓存中。 如果不存在Picasso将检查磁盘缓存。 如果它在磁盘上不可用,那么Picasso才会启动网络请求。

所有请求的图像都存储在两个缓存中,直到它们必须被删除才能释放空间。

2.5.2中的默认值是:

  • LRU内存缓存为可用应用程序RAM的15%
  • 2%存储空间的磁盘缓存高达50MB但不低于5MB。
  • 毕加索将使用OkHttp作为Http客户端,如果它作为Gradle依赖项包含在内。 否则Picasso将回归到HttpUrlConnection。

您可以像这样增加磁盘缓存(示例为100MB):

  Picasso picasso = new Picasso .Builder(this) .downloader(new OkHttpDownloader(getCacheDir(), 100000000)) .build(); Picasso.setSingletonInstance(picasso); 

更改光盘缓存大小不会更改缓存策略。

内存政策

  • MemoryPolicy.NO_CACHE:图像不会从内存中提供。 这个不能避免从磁盘提供图像。 避免磁盘查看网络策略
  • MemoryPolicy.NO_STORE:图像不会存储在内存中。 将其用于仅加载一次的图像。

 Picasso .with(context) .load(https://goo.gl/v9EkbF) .memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE) .into(imageView); 

网络政策

  • NetworkPolicy.NO_CACHE:不会从磁盘缓存提供映像。
  • NetworkPolicy.OFFLINE:图像将(如果可能)仅从缓存(内存或磁盘)提供,但从不从网络提供。

例:

 Picasso .with(context) .load(https://goo.gl/v9EkbF) .networkPolicy(NetworkPolicy.NO_CACHE) .into(imageView); 

内存和缓存注意事项

  • Glide默认使用RGB565并将resize的图像缓存到内存中。
  • Picasso默认使用RGB888并将全尺寸图像缓存到内存中,让GPU在绘制时进行实时resize。

RGB565的尺寸是RGB888的一半。 使用RGB565和更小图像的结果是毕加索的内存占用率(可能是3倍/ 4倍)比Glide更高。

这些只是默认值。 Glide可以配置为使用RGB888和Picasso来使用RGB565。 Picasso可以配置为只调整Glide等已resize的图像。

在相同的设置下,内存占用几乎相同。

带宽考虑因素

  • Glide为每个大小缓存单独的文件。 如果您加载另一个大小的同一图像,它将再次下载,resize,然后缓存。
  • Picasso始终从缓存中获取全尺寸图像,然后让GPU调整视图大小。

您可以要求Glide缓存所有内容,全尺寸图像和resize的图像,但默认情况下Glide的带宽消耗更高。

注意

毕加索2.6即将到来,我不知道什么是不同的/新的。

来源

  • 毕加索
  • 适用于Android的Glide,Image Loader Library简介,由Google推荐
  • 什么是默认缓存策略?
  • 毕加索 – 影响图像缓存

您可以使用同一供应商“SquareUp”中的OkHttp。
这个答案向您展示了如何使用细节。

更新:链接是旧的,顺便说一句,以下是最新版本的更改:

https://github.com/square/picasso/blob/master/CHANGELOG.md

正如@Sotti所说, PicassoAutomatic memory and disk caching ,他们在引言部分提到了这一点:(最后一部分)**

http://square.github.io/picasso/#introduction


在这个查询中我们将得到Glid的解决方案,但不是Picasso.how我可以重用图像而不需要重新加载不同尺寸的ImageView

实际上, Picasso只有一个内存缓存 ,但你可能想要使用OkHttp

检查此链接: https : //stackoverflow.com/a/18552559/4409113其中说:

如果您指的是磁盘缓存, 那么Picasso目前不支持这种情况 。 这是设计原因,因为磁盘层缓存是由HTTP layer完成的,并没有对它进行区分。

检查一下: https : //corner.squareup.com/2013/05/picasso-one-dot-oh.html

Picasso自动利用内存和磁盘缓存HTTP client )来加速位图加载。 对于开发,您可以启用彩色标记的显示,以指示图像源。

另外,请检查这个问题: 如何使用picasso库实现我自己的磁盘缓存 – Android?

使用OkHttp将文件保存在自定义缓存目录中:

 OkHttpClient okHttpClient = new OkHttpClient(); File customCacheDirectory = new File(Environment.getExternalStorageDirectory().getAbsoluteFile() + "/MyCache"); okHttpClient.setCache(new Cache(customCacheDirectory, Integer.MAX_VALUE)); OkHttpDownloader okHttpDownloader = new OkHttpDownloader(okHttpClient); Picasso picasso = new Picasso.Builder(mainActivity).downloader(okHttpDownloader).build(); picasso.load(imageURL).into(viewHolder.image); 

来自: https : //stackoverflow.com/a/33276054/4409113

如您所见,使用setCache