Picasso默认不会调整图片的大小。如果你简单地调用像下面这样的代码...
Picasso.with(context).load("https://goo.gl/v9EkbF").into(imageView);
...Picasso正在缓存完整大小的图像。从那一刻起,每次调用相同的URL,Picasso都将重用那个完整大小的图像,并让GPU将其调整大小到视图中。
如果使用resize()方法,则仅缓存调整大小的图像,如果您使用不同的大小,则Picasso需要重新下载该图像。
不要使用resize()选项,您将获得更好的带宽使用情况,但请注意内存使用情况。
Picasso的默认设置
Picasso确实具有自动内存和磁盘缓存。任何最近请求的图像都将在内存缓存中。如果那里没有,Picasso将检查磁盘缓存。如果磁盘上没有可用的图像,那么Picasso将开始网络请求。
所有请求的图像都会存储在两个缓存中,直到为了释放空间而必须删除它们为止。
2.5.2版本的默认值如下:
- 15%可用应用程序RAM的LRU内存缓存
- 2%存储空间,最多50MB但不少于5MB的磁盘缓存。
- 如果包含在Gradle依赖项中,则Picasso将使用OkHttp作为Http客户端。否则,Picasso将退回到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 和较小的图像会导致 Picasso 的内存占用量更高(可能是 Glide 的 3 倍/4 倍)。
这些只是默认设置。Glide 可以配置为使用 RGB888,Picasso 可以配置为使用 RGB565 并仅在内存中缓存调整大小后的图像,就像 Glide 一样。
在相同的设置下,内存占用量几乎相同。
带宽考虑因素
- Glide 为每个尺寸缓存单独的文件。如果您加载同一图像的另一个尺寸,则会在调整大小和缓存之前再次下载。
- Picasso 总是从缓存中获取完整尺寸的图像,然后让 GPU 将其调整大小以适应视图。
您可以要求 Glide 缓存所有内容,包括完整尺寸的图像和调整大小后的图像,但默认情况下 Glide 的带宽消耗更高。
注意
Picasso 2.6 即将推出,我不知道有什么不同/新功能。
来源