默认情况下,毕加索不会调整图像大小。如果你像下一个一样打一个简单的电话......
Picasso.with(context).load("https://goo.gl/v9EkbF").into(imageView);
...毕加索正在缓存全尺寸图像。从那一刻起,每次调用同一个 URL 时,Picasso 都会重用该全尺寸图像,并让 GPU 调整视图的大小。
使用 resize() 方法你只是缓存调整大小的图像,如果你使用不同的大小,毕加索将需要重新下载图像。
不要使用 resize() 选项,你会得到更好的带宽使用,但要小心内存使用。
毕加索的默认设置
毕加索确实有自动内存和磁盘缓存。最近请求的任何图像都将在内存缓存中。如果它不存在,毕加索将检查磁盘缓存。如果它在磁盘上不可用,那么只有 Picasso 会启动网络请求。
所有请求的图像都存储在两个缓存中,直到必须删除它们以释放空间。
2.5.2 中的默认值是:
- 15% 的可用应用程序 RAM 的 LRU 内存缓存
- 2% 存储空间的磁盘缓存,最大 50MB 但不小于 5MB。
- 如果 OkHttp 作为 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 并将调整大小的图像缓存到
记忆。
- 毕加索默认使用 RGB888 并将全尺寸图像缓存到
内存并让 GPU 在绘制时实时调整大小。
RGB565 是 RGB888 大小的一半。使用 RGB565 和更小图像的结果是 Picasso 的内存占用比 Glide 的更高(可能是 3x/4x)。
这些只是默认值。 Glide 可以配置为使用 RGB888,Picasso 可以配置为使用 RGB565。 Picasso 可以配置为仅将调整大小的图像(如 Glide)放入内存。
在相同的设置下,内存占用几乎相同。
带宽考虑
- Glide 为每个大小缓存单独的文件。如果您加载另一个尺寸的
相同的图像,它会在之前再次下载,调整大小,然后
缓存。
- Picasso 始终从缓存中获取全尺寸图像,然后让 GPU 将大小调整到视图中。
您可以要求 Glide 缓存所有内容,全尺寸图像和调整大小的图像,但默认情况下 Glide 的带宽消耗更高。
注意
Picasso 2.6 来了,我不知道有什么不同/新的。
来源