内存溢出错误 "无法分配 31961100 字节内存,当前有 4194304 字节可用,再使用 27MB 后将发生内存溢出"

6

我正在从JSON加载图像到ImageView。JSON只提供图像URL的路径。我正在使用Picasso设置值。但某些图像会出现错误,而其他图像则正常工作。

Picasso.with(context).load(rowItem.getProductImages().get(0)).into(holder.productImageView);

错误信息为:

 2771-2793/com.koove E/art﹕ Throwing OutOfMemoryError "Failed to allocate a 31961100 byte allocation with 4194304 free bytes and 27MB until OOM"
03-25 09:53:23.666    2771-2793/com.koove D/skia﹕ --- decoder->decode returned false

1
你需要在后台下载图片,然后将它们调整大小(或复制其中一个)以适应屏幕尺寸/演示尺寸(同样在后台),然后显示它们。 - Tigger
1个回答

5
你应该使用Picasso中的fit()方法,它会测量目标ImageView的尺寸,并在内部使用resize()方法将图像大小缩小到ImageView的尺寸。这样做的好处是,图像的分辨率最低,而不影响其质量。较低的分辨率意味着需要在缓存中保存的数据更少。
Picasso.with(context).load(rowItem.getProductImages().get(0)).fit().into(holder.productImageView);

如果你仍然遇到OOM问题,请使用内存策略删除缓存。
Picasso.with(context).load(rowItem.getProductImages().get(0)).memoryPolicy(MemoryPolicy.NO_CACHE).fit().into(holder.productImageView);

很好的答案。fit() 对我真的很有用。只是想知道,如果(fit() == false)条件下,我能否处理memoryPolicy()条件? - VVB
我认为不是这样的,fit()方法返回一个RequestCreator对象。由于使用fit()可能会延迟图像请求,您可以改用resize()和onlyScaleDown()方法,然后,只有当图像大于调整大小参数时,才会调整大小。以下是关于Picasso使用方法的优秀链接:https://futurestud.io/blog/picasso-image-resizing-scaling-and-fit - Lilo
好的。谢谢您提供宝贵的意见。能否简单说明一下这个问题产生的原因?只用一句话就行。 - VVB

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