Java 是否再次下载毕加索图像以获得不同尺寸的ImageView?

Java 是否再次下载毕加索图像以获得不同尺寸的ImageView?,java,android,picasso,Java,Android,Picasso,我在我的应用程序中使用毕加索高效地加载图像,这是他的最佳工作。问题是,当前如果我使用同一url多次调用Picasso.with(),但是每次使用具有不同维度的图像视图,图像再次被下载。在Glide中,我们有方法.diskCacheStrategy()和diskCacheStrategy.SOURCE来解决这个问题。毕加索有其他方法吗 在查询中,我们将得到Glid的解决方案,而不是毕加索的解决方案。如何在不重新下载的情况下重新使用不同维度的图像ImageView 这是我正在使用的代码 Picass

我在我的应用程序中使用毕加索高效地加载图像,这是他的最佳工作。问题是,当前如果我使用同一url多次调用
Picasso.with()
,但是每次使用具有不同维度的图像视图,图像再次被下载。在
Glide
中,我们有方法
.diskCacheStrategy()
diskCacheStrategy.SOURCE
来解决这个问题。毕加索有其他方法吗

在查询中,我们将得到Glid的解决方案,而不是毕加索的解决方案。如何在不重新下载的情况下重新使用不同维度的图像ImageView

这是我正在使用的代码

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

您可以使用同一供应商“SquareUp”提供的
OkHttp


详细说明如何操作。

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

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

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

Picasso.Builder(context).downloader(customDownloader)

可能会让事情变得更清楚更新:链接很旧,顺便说一下,以下是最新版本中的更改:

正如@Sotti所说,
毕加索
拥有
自动内存和磁盘缓存
,他们在引言部分提到了这一点:(最后一部分)**


在这个查询中,我们将得到Glid的解决方案,但不是Glid的解决方案 毕加索。如何在不重新下载图像的情况下重新使用图像 尺寸
ImageView

实际上,
毕加索
只有一个内存缓存,但您可能需要使用
OkHttp
来实现这一点

检查这个链接:上面写着:

如果你指的是磁盘缓存,那么毕加索就不会 目前支持这一点。这是设计上的,因为磁盘层 缓存由
HTTP层
完成,对它没有区别

你也可以看看这个:

毕加索自动利用内存和磁盘缓存由 HTTP客户端(HTTP客户端)可以加快位图加载速度。为了发展,你可以 启用指示图像的彩色标记的显示 来源

此外,请检查以下问题:

要使用
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);
发件人:

如您所见,使用


默认情况下,毕加索不会调整图像大小。如果你打一个简单的电话,比如下一个

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):

更改磁盘缓存大小不会更改缓存策略

内存策略

  • MemoryPolicy.NO_缓存:不会从内存提供映像。这一个不能避免从磁盘提供图像。避免磁盘看不起网络策略
  • MemoryPolicy.NO_STORE:图像不会存储在内存中。将此选项用于仅加载一次的图像
范例

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

  • NetworkPolicy.NO\u缓存:不会从磁盘缓存提供映像
  • 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)放入内存

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

带宽注意事项

  • Glide为每个大小缓存单独的文件。如果您加载其他尺寸的 同样的图像,它将再次下载之前,调整大小,然后 缓存
  • 毕加索总是从缓存中获取全尺寸图像,然后让GPU在视图中调整大小
您可以要求Glide缓存所有内容,包括全尺寸图像和调整大小的图像
Picasso
        .with(context)
        .load(https://goo.gl/v9EkbF)
        .networkPolicy(NetworkPolicy.NO_CACHE)
        .into(imageView);