安卓Picasso配置LruCache大小

14

我在我的项目中使用流行的Picasso,但是我已经倾倒了堆,看起来像这样。现在昨天它为Picasso使用的LruCache给了我48M。

我该如何指定其大小?

注意:我的加载图片明显很大。

如果有人提出fit()或centerCrop(),我读到这些函数会减小图像尺寸,对吗?但有时我必须在ListView中全景显示小图像。

现在,这些函数是否会缓存缩小的图像?

输入图像描述

2个回答

52

默认情况下,Picasso将可用堆的1/7用于其LRU。这是一个“幸福”的分数,适用于所有设备。

您可以通过向Picasso.Builder传递自定义实例来配置内存缓存的大小。它可以是LruCache的实例,其使用最大值或任何其他Cache的实例。

Picasso p = new Picasso.Builder(context)
    .memoryCache(new LruCache(24000))
    .build();
在你尝试缩小缓存大小之前,请记住将Bitmap实例保留在RAM中可以使其立即显示。未使用的RAM是浪费的RAM。内存缓存应该尽可能使用更多的RAM,而不会导致OOM(显然)或不必要的GC来释放空间。

在进行缓存优化时,请注意这些指南:

  • 在初始化应用程序时开始缓存。
  • 将缓存视为已占用的部分。
  • 当get()返回null时,请确保重新创建缓存。
  • 缓存失效可能会导致性能低下,因此请考虑使用LRU算法或类似的技术。

1
嗨,Jake先生,我目前正在开发的应用程序主要基于图像处理,因此它需要大量的内存堆。但是现在使用默认缓存计算覆盖可用内存的15%的picasso实际上已经用完了内存。那么我可以在picasso中使用https://github.com/JakeWharton/DiskLruCache进行磁盘缓存吗?有任何示例或提示吗? - KunalK
1
其实我的需求是从SD卡中访问所有完整的图像,并应用自定义转换以生成缩略图像,这些图像需要被缓存在SD卡而不是内部存储器中。但现在没有问题了,因为我设法在LRUCache.java文件中实现了DiskLruCache,并且它也可以正常工作。谢谢 :) - KunalK
1
LRU缓存在主线程上进行查询。希望你不要在“get()”中进行磁盘访问。 - Jake Wharton
1
@JakeWharton你说1/7的堆被预留给LruCache,但在内存报告中,LruCache实例的使用率超过了40%。我在MAT中得到了类似的结果,你能解释一下吗? - Tommaso Barbugli
1
这40%+的问题可能是由于应用程序本身存在泄漏,或者是因为Picasso的LRUCache被保留在某个地方。 - Lalith B
显示剩余9条评论

4
以下代码将增加Picasso缓存大小至250 MB。
Picasso picasso =  new Picasso.Builder(this).downloader(new OkHttpDownloader(getCacheDir(), 250000000)).build();
Picasso.setSingletonInstance(picasso);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接