我有一个屏幕,我必须在屏幕上显示两个相似的图像。这两个图像的大小都是动态的,但它们覆盖了大部分屏幕。当我在我的应用程序中导航到此屏幕时,我在AndroidStudio中看到内存监视器中有12MB的峰值,这意味着这两个图像都使用了12MB,因为该屏幕上没有其他UI元素,因为这两个图像类似,需要等量屏幕空间,我想每个显示时消耗6MB的内存。这些图像的尺寸为1174 x 1174像素,res目录中的尺寸为396KB。
我尝试过使用Glide,但是当这些图像通过Glide加载时我也会看到相同的内存峰值。如果应用程序尝试占用的内存超过可用内存,并且在我的应用程序的其他部分中大量使用图像,即使Glide也无法帮助。所以总会有内存紧缩,我在应用程序中显示了很多OutOfMemory异常,显示这两个图像。
所以我的问题是如何减少这些图像的内存使用量?另外,为什么图像在res文件夹中的大小为396KB时需要6MB的内存?
答案 0 :(得分:2)
我猜你没有压缩你的图像,在图像压缩时使用https://github.com/zetbaitsu/Compressor非常棒。我也猜测你确实使用了Glide缓存策略。
然而,Glide会缓存原始的全分辨率图像以及该图像的其他较小版本。例如,如果您请求的图像为1000x1000像素,而ImageView的像素为500x500像素,则Glide会将图像的两个版本都放在缓存中。要回答您的答案,您需要手动跟踪android中的缓存量。尝试强制进行垃圾收集。通常,VM仅在绝对需要时执行垃圾收集,因为它很昂贵。但是,在某些情况下强制进行垃圾收集会很有用。例如,在查找内存泄漏时,如果要确定是否已成功释放大对象,则可以比平时更积极地启动垃圾收集。
希望这有用。