我在我的应用程序中使用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()
答案 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中的默认值为:
您可以像这样增加磁盘缓存(例如100MB):
Picasso picasso = new Picasso
.Builder(this)
.downloader(new OkHttpDownloader(getCacheDir(), 100000000))
.build();
Picasso.setSingletonInstance(picasso);
更改光盘缓存大小不会更改缓存策略。
内存政策
实施例
Picasso
.with(context)
.load(https://goo.gl/v9EkbF)
.memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)
.into(imageView);
网络政策
示例:
Picasso
.with(context)
.load(https://goo.gl/v9EkbF)
.networkPolicy(NetworkPolicy.NO_CACHE)
.into(imageView);
内存和缓存注意事项
RGB565是RGB888的一半大小。使用RGB565和更小图像的结果是毕加索的内存占用率(可能是3倍/ 4倍)比Glide的更高。
这些只是默认值。 Glide可以配置为使用RGB888和Picasso来使用RGB565。毕加索可以配置为只调整像Glide这样经过调整大小的图像。
在相同的设置下,内存占用量几乎相同。
带宽注意事项
你可以要求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
。