Picasso Image再次下载了不同尺寸的ImageView?

时间:2016-02-02 14:34:52

标签: java android picasso

我在我的应用程序中使用Picasso有效地加载图像并且正在最好地完成他的工作。问题是,目前如果我使用相同的URL多​​次调用jquery.print,但每次都是一个具有不同尺寸的图像视图,图像会再次下载。在 it('fires print when the print button is clicked', () => { const previewCAS = TestUtils.renderIntoDocument(<PrintAsset />); const button = TestUtils.scryRenderedDOMComponentsWithTag(PrintAsset, 'button'); TestUtils.Simulate.click(button[0]); // breaks here // expect(Print).to.have.been.called(); }); 我们有Picasso.with()方法Glide来解决问题。毕加索还有其他方法吗?

this查询中,我们将获得Glid的解决方案但不适用于Picasso.how我可以重用图像而无需重新加载不同尺寸的ImageView。

这是我使用

的代码
.diskCacheStrategy()

4 个答案:

答案 0 :(得分:8)

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

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

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

进行设置
Picasso.Builder(context).downloader(customDownloader)

this link可能会让事情变得清晰

答案 1 :(得分:5)

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

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

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

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

不要使用resize()选项,您可以获得更好的带宽使用率,但请注意内存使用情况。

毕加索的默认设置

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

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

2.5.2中的默认值为:

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

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

这些只是默认值。 Glide可以配置为使用RGB888和Picasso来使用RGB565。毕加索可以配置为只调整像Glide这样经过调整大小的图像。

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

带宽注意事项

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

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

注意

Picasso 2.6即将到来,我不知道有什么不同/新的。

<强>来源

答案 2 :(得分:3)

您可以使用同一供应商的OkHttp&#34; SquareUp&#34;。
This answer告诉您如何使用详细信息进行操作。

答案 3 :(得分:3)

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

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

正如@Sotti所说,Picasso Automatic 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 )以加快位图加载速度。为了发展,你可以   启用彩色标记的显示,以指示图像   源。

另外,请检查此问题:How to implement my own disk cache with picasso library - 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