我对Picasso
用于下载和缓存图片的机制有疑问。
Picasso
如何下载图片?我知道它正在使用样本大小。我对吗?如果服务器上的图像是1000x1000但ImageView
只有400x400,那么它将只下载500x500图像并将被缓存。或者它可能会以全分辨率下载,然后缩放到特定大小。
答案 0 :(得分:2)
这是我的实际代码 - 而且我确信还有更多的人 - 使用
Picasso.with(context).load(url).fit().centerCrop().into(imageView);
Picasso无法知道它应该只下载500 * 500像素。即使图片大于需要,fit()
和centercrop()
方法也会使其适合。
答案 1 :(得分:1)
您可以在https://github.com/square/picasso浏览毕加索的源代码。
下载图片
你可以看到Picasso下载了Downloader
接口实现的图像。它使用名为OkHttpDownloader
的默认下载程序,它使用OkHttp库。当无法加载时,毕加索使用UrlConnectionDownloader
。
识别图像尺寸
Picasso在下载之前不知道图像的大小。如果您正在开发后端服务器,您可以通过某种方式指定图像的大小,因此您的移动应用程序将通过执行具体请求来了解它,但Picasso本身无法识别它。 Picasso必须以完整大小下载图像,然后此库可以被裁剪或调整大小。
<强>缓存强>
我们可以在源代码中的Picasso文档中找到有关Cache的以下信息:
Picasso实例会自动初始化,默认值为 适合大多数实现。
- LRU内存缓存可用应用程序RAM的15%
- 2%存储空间的磁盘缓存高达50MB但不低于5MB。 (注意:如果您使用的话,这仅适用于API 14+ 或 一个独立的库,在所有API级别上提供磁盘缓存 OkHttp)
- 三个用于磁盘和网络访问的下载线程。
它非常清楚地解释了这个库中缓存的用法。 我只是不确定,如果Picasso在转换之前存储图像(调整大小,裁剪等)或在缓存中转换之后。第一个选项对我来说似乎更合理,因为我们决定稍后应用不同的转换,因此我们可能希望保留原始图像。