毕加索图像再次下载为具有不同尺寸的图像视图?

2022-09-03 06:35:27

我在我的应用程序中使用毕加索来有效地加载图像,并且正在以最佳状态完成他的工作。问题是,目前,如果我使用相同的URL多次调用,但是每次使用具有不同尺寸的图像视图时,图像都会再次下载。在我们有解决 problem.is 毕加索还有什么其他方法吗?Picasso.with()Glide.diskCacheStrategy()DiskCacheStrategy.SOURCE

在此查询中,我们将获得Glid的解决方案,但不会获得毕加索的解决方案.我如何重用图像而无需重新下载不同尺寸的图像View。

这是我使用的代码

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

答案 1

毕加索没有将图像缓存到磁盘,毕加索只有内存缓存。磁盘缓存由网络库 (OKhttp) 完成。因此,写入磁盘缓存的图像永远不会重新调整大小。

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

如果您的项目使用的是 okhttp 库,那么毕加索会自动将其用作默认下载器。如果您使用的是任何其他网络库,则必须编写自己的下载器并使用

Picasso.Builder(context).downloader(customDownloader)

此链接可能会使事情变得清晰


答案 2

默认情况下,毕加索不会调整图像大小。如果您像下一个电话一样进行简单的调用...

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

...毕加索正在缓存全尺寸图像。从那一刻起,每次你调用同一个URL时,毕加索都会重用那个全尺寸的图像,让GPU调整到视图中。

使用 resize() 方法,您只是缓存已调整大小的图像,如果您使用不同的大小,毕加索将需要再次下载图像。

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

毕加索中的默认值

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

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

2.5.2 中的默认值为:

  • LRU 内存缓存为可用应用程序 RAM 的 15%
  • 磁盘缓存的2%存储空间高达50MB但不小于5MB。
  • 毕加索将使用OkHttp作为Http客户端,如果它被包含在Gradle依赖项中。否则,毕加索将退回到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 并将调整大小的图像缓存到内存中。
  • 默认情况下,毕加索使用RGB888并将全尺寸图像缓存到内存中,并让GPU在绘制时进行实时调整大小。

RGB565 的大小是 RGB888 的一半。使用RGB565和较小图像的结果是毕加索的内存占用量高于Glide的内存占用量(可能是3x / 4x)。

这些只是默认值。Glide可以配置为使用RGB888,毕加索可以配置为使用RGB565。毕加索可以配置为只将调整大小的图像(如Glide)扔到内存中。

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

带宽注意事项

  • 滑动为每个大小缓存单独的文件。如果加载同一图像的另一个大小,它将在之前再次下载,调整大小,然后缓存。
  • 毕加索总是从缓存中获取全尺寸图像,然后让GPU将大小调整到视图中。

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

注意

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

来源


推荐